我已经使用new创建了对象,但在将它们添加到向量之前,我对它们进行了解引用。尽管我在互联网上搜索了一下,但我还是搞不清楚如何调用delete来删除这些项目。我只想使用我不想要的标准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;
}发布于 2012-02-16 08:49:58
需要删除的对象不在矢量中,因为矢量元素不是用new创建的。当您在push_back中使用解引用操作符时,您只是将malloc的双精度值的副本传递给向量,而不是实际分配的双精度值。
你实际上只是泄露了它们--你的代码在没有分配双精度的情况下会运行得很好:
void createObjects() {
vectorDouble.push_back(13);
vectorDouble.push_back(14);
vectorDouble.push_back(15);
}发布于 2012-02-16 09:09:34
正如每个人所指出的,没有任何理由在您的程序中调用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不会把指针的副本放在向量中,它会把对象的副本放在向量中。一旦你制作了对象的副本,那么你的对象的内存就不再有持续的作用,可以被销毁。
发布于 2012-02-16 08:49:52
函数createObjects不会将分配的值放入向量中;它会放入值,然后会泄漏a、b和c所指向的内存。呼叫声:
vectorDouble.push_back(*a);将a指向的值存储在向量中(*a取消引用指针,您可能已经知道了)。一旦该函数返回,指针就会丢失。您不能从向量中检索它们。您可能需要创建一个指向doubles的指针向量,或者(更有可能)甚至不分配值;只需存储doubles即可。
https://stackoverflow.com/questions/9303921
复制相似问题