我使用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;
}
答案 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没有将分配的值放入向量中;它正在输入值,然后泄漏内存 a
,b
和c
指向的内容。电话:
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。)