首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从矢量中删除取消引用的元素

从矢量中删除取消引用的元素
EN

Stack Overflow用户
提问于 2012-02-16 08:42:38
回答 5查看 604关注 0票数 0

我已经使用new创建了对象,但在将它们添加到向量之前,我对它们进行了解引用。尽管我在互联网上搜索了一下,但我还是搞不清楚如何调用delete来删除这些项目。我只想使用我不想要的标准C++和STL (例如)使用Boost库。

正如你所看到的,a,b和c失去了作用域,剩下我认为是向量中的副本。我该如何删除它们呢?我不想将指针存储在数组中,因为我需要向API函数传递一个双精度数组。

请某人-我如何删除这些对象?

代码语言:javascript
复制
#include <iostream>
#include <vector>

using namespace std;

vector<double> vectorDouble;
void createObjects();

void createObjects() {
    double* a=new double(13);
    double* b=new double(14);
    double* c=new double(15);
    //a,b and c are not contiguous memory blocks
    cout << "memory location of a: " << a << endl;
    cout << "memory location of b: " << b << endl;
    cout << "memory location of c: " << c << endl;

    vectorDouble.push_back(*a);
    vectorDouble.push_back(*b);
    vectorDouble.push_back(*c);
}

int main() {
    createObjects();
    //the memory addresses are contiguous 8 byte chunks
    cout << "vector memory at 0: " << &(vectorDouble[0]) << endl;
    cout << "vector memory at 1: " << &(vectorDouble[1]) << endl;
    cout << "vector memory at 2: " << &(vectorDouble[2]) << endl;

    //get pointer to the 2nd element
    double *P=&(vectorDouble[1]); 

    //dereference and look inside - two memory locations both contain the value 14
    cout << "vector Pointer P ["<< P <<"] contains " << *P <<endl;

    //Which should I call delete on? I have lost reference to the original pointers.
    //How should I call delete on the vector?

    cout << "deleting pointer that references 2nd vector element" << endl;
    delete P; //********* CRASH **********
    cout << "Done deleting" << endl;
}
EN

回答 5

Stack Overflow用户

发布于 2012-02-16 08:49:58

需要删除的对象不在矢量中,因为矢量元素不是用new创建的。当您在push_back中使用解引用操作符时,您只是将malloc的双精度值的副本传递给向量,而不是实际分配的双精度值。

你实际上只是泄露了它们--你的代码在没有分配双精度的情况下会运行得很好:

代码语言:javascript
复制
void createObjects() {
    vectorDouble.push_back(13);
    vectorDouble.push_back(14);
    vectorDouble.push_back(15);
}
票数 2
EN

Stack Overflow用户

发布于 2012-02-16 09:09:34

正如每个人所指出的,没有任何理由在您的程序中调用new

代码语言:javascript
复制
void createObjects() {
    vectorDouble.push_back(13);
    vectorDouble.push_back(14);
    vectorDouble.push_back(15);
}

但是,假设您确实有理由调用new。(我无法想象它会是什么,但让我们假设您是一个天才)。下面是你如何做到这一点:

代码语言:javascript
复制
void createObjects() {
    double* a=new double(13);
    double* b=new double(14);
    double* c=new double(15);
    //a,b and c are not contiguous memory blocks
    cout << "memory location of a: " << a << endl;
    cout << "memory location of b: " << b << endl;
    cout << "memory location of c: " << c << endl;

    vectorDouble.push_back(*a);
    vectorDouble.push_back(*b);
    vectorDouble.push_back(*c);

    delete a;
    delete b;
    delete c;
}

你看,push_back不会把指针的副本放在向量中,它会把对象的副本放在向量中。一旦你制作了对象的副本,那么你的对象的内存就不再有持续的作用,可以被销毁。

票数 2
EN

Stack Overflow用户

发布于 2012-02-16 08:49:52

函数createObjects不会将分配的值放入向量中;它会放入值,然后会泄漏abc所指向的内存。呼叫声:

代码语言:javascript
复制
vectorDouble.push_back(*a);

a指向的值存储在向量中(*a取消引用指针,您可能已经知道了)。一旦该函数返回,指针就会丢失。您不能从向量中检索它们。您可能需要创建一个指向doubles的指针向量,或者(更有可能)甚至不分配值;只需存储doubles即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9303921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档