从向量中删除解除引用的元素

时间:2012-02-16 00:42:38

标签: c++ stl vector

我使用new创建了对象,但在将它们添加到向量之前已经取消引用它们。尽管在互联网上搜索,但我无法弄清楚如何在这些项目上调用删除。我想这样做只是使用标准C ++和STL我不希望(例如)使用Boost库。

正如你可以看到a,b和c失去了范围,我留下了我认为是向量中的副本。如何删除这些内容。我不想在数组中存储指针,因为我需要将API函数传递给双精度数组。

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

#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;
}

5 个答案:

答案 0 :(得分:2)

您需要删除的对象不在向量中,因为您的向量元素不是使用new创建的。当你在push_back中使用dereference运算符时,你只是传递了malloc'd双精度的副本,而不是传递给向量的实际分配的双精度。

你实际上只是泄漏它们 - 你的代码运行良好而不分配双打:

void createObjects() {
    vectorDouble.push_back(13);
    vectorDouble.push_back(14);
    vectorDouble.push_back(15);
}

答案 1 :(得分:2)

正如所有人所指出的那样,没有任何理由在你的程序中调用new

void createObjects() {
    vectorDouble.push_back(13);
    vectorDouble.push_back(14);
    vectorDouble.push_back(15);
}

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

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 :(得分:1)

函数createObjects没有将分配的值放入向量中;它正在输入值,然后泄漏内存 abc指向的内容。电话:

vectorDouble.push_back(*a);

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

答案 3 :(得分:0)

我想我遇到了问题:

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

您将a,b和c作为值传递,因此数组实际上并不包含您创建的变量(这就是为什么它们现在具有不同的内存地址,它们是变量内容的副本!)。然后你可以删除方法里面的变量,不要在方法中使用指针或使用double * vector。

答案 4 :(得分:0)

您的泄密位于createObjects(),因为std::vector<>::push_back()会复制其参数。您应该在delete范围结束之前createObjects()指针。

那就是说,我不明白为什么你开始使用动态分配。如果你可以避免这种情况,请做(你可以使用像std::unique_ptr<>这样的智能指针,或者更好的使用普通的double s。)