c++ - std vector 保存指针和变量地址。清理?

标签 c++ pointers vector

假设我有一个 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_ptrunique_ptr 而不是原始指针,并且对于堆栈变量,将删除器设置为什么都不做的功能。

关于c++ - std vector 保存指针和变量地址。清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9718133/

相关文章:

c - 指向正确内存位置的指针

C++ vector 插入和读取

algorithm - 由矢量构建的多边形 - 找到最大的区域,需要有序的顶点列表

c++ - 如何仅从文件中读取特定字符?

c++ - 如何检测我的代码是否使用 -fno-exceptions 进行编译?

c - C 中赋值错误中的左值无效

c - c中(char*)是什么意思?

c++ - 使用指针访问struct c++ vector 中的元素

c++ - 当我将 true 分配给 int 变量时,为什么编译器不会提示?

c++ - 使用 g++ 是否可以在不修改源代码的情况下将动态链接库加载到指定的命名空间下?