标准向量保存指针和变量地址。清理?

时间:2012-03-15 10:46:09

标签: c++ pointers 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();

2 个答案:

答案 0 :(得分:3)

您只能删除指针new或空指针的结果。 &j不是new的结果,并且不是空指针。

所以你的代码不安全。没有可移植的方法可以从指针中找出它是指向自动对象还是动态对象。

您可以单独维护一个标志,指示它是什么,或者您可以使用shared_ptrunique_ptr而不是原始指针,并且对于堆栈变量,将删除器设置为无效功能。< / p>

答案 1 :(得分:1)

如果你编写凌乱的代码,你会得到凌乱的结果。你可以像你一样使用指向当地人的指针,但除非你清楚地检查你做了什么,否则你最终也会得到你的结果。这是一个可能有帮助的interesting article on new() & delete()