std矢量包含指针和变量地址.清理

std vector holds pointers and variable addresses. clean up?

本文关键字:变量 地址 清理 指针 包含 std      更新时间:2023-10-16

假设我有一个向量,它包含指向动态内存的指针,也包含堆栈上声明的变量的地址,有没有一种方法可以安全地循环并仅删除动态内存,或者我只能使用其中一个?还是做以下事情是安全的?我想,根据编译器的不同,结果可能是不可预测的。

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_ptrunique_ptr而不是原始指针,并且对于堆栈变量,将deleter设置为一个无所事事的函数。

如果编写混乱的代码,很可能会得到混乱的结果。你可以像你一样使用指向局部的指针,但除非你对你所做的事情进行明确的检查,否则你最终也会得到你的结果;delete(),这可能会有所帮助。