假设我有一个 vector ,其中包含指向动态内存的指针以及在堆栈上声明的变量的地址,是否有一种方法可以安全地循环并仅删除动态内存,或者我是否只能使用一个或另一个?或者做以下安全吗?我认为根据编译器的不同,结果可能无法预测。
std::vector<int*> theInts;
int* i = new int;
*i = 1;
theInts.push_back(i);
int j = 2;
theInts.push_back(&j);
std::vector<int*>::iterator iIt=theInts.begin();
for(;iIt<theInts.end();iIt++)
delete *iIt;
编辑: 在查看共享指针时,我暂时更改为使用原始指针,同时有人可以告诉我以下内容是否安全吗?它是我的程序正在执行的分解版本
vector<int*>theInts;
int* anInt = new int;
theInts.push_back(anInt);
if(NULL != anInt)
delete anInt;
anInt = NULL;
vector<int*>::iterator bIt = theInts.begin();
for(;bIt!=theInts.end();bIt++)
{
int* aInt = *bIt;
if(NULL!=aInt)
delete aInt;
aInt=NULL;
}
theInts.clear();
最佳答案
您只能删除作为 new
的结果或空指针的指针。 &j
不是 new
的结果,也不是空指针。
所以你的代码不安全。没有可移植的方法可以仅通过指针来确定它指向的是自动对象还是动态对象。
您可以单独维护一个标志来指示它是哪个,或者您可以使用 shared_ptr
或 unique_ptr
而不是原始指针,并且对于堆栈变量,将删除器设置为什么都不做的功能。
关于c++ - std vector 保存指针和变量地址。清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9718133/