C++ std向量保存指针和变量地址。清理

C++ std向量保存指针和变量地址。清理,c++,pointers,vector,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*>::it

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

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;
std::vector theInts;
int*i=新的int;
*i=1;
三、推回(一);
int j=2;
内容。推回(&j);
std::vector::迭代器iIt=theInts.begin();

对于(;iIt您只能删除
new
的结果或空指针。
&j
不是
new
的结果,也不是空指针

因此,你的代码是不安全的。没有可移植的方法来确定,仅仅从指针,它是否指向自动或动态对象


您可以单独维护一个标志,指示它是哪一个,或者可以使用
shared_ptr
unique_ptr
而不是原始指针,并且对于堆栈变量,将deleter设置为不做任何事的函数。

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

因此,你的代码是不安全的。没有可移植的方法来确定,仅仅从指针,它是否指向自动或动态对象



您可以单独维护一个标志来指示它是哪一个,或者您可以使用
shared_ptr
unique_ptr
而不是原始指针,并且对于堆栈变量,将deleter设置为一个不做任何事情的函数。

如果您编写混乱的代码,很可能会得到混乱的结果。您可以像这样使用指向局部变量的指针,但您将除非你清楚地检查自己所做的事情,否则结果也会很糟糕。以下是一个可能会有所帮助的方法。

如果你编写了混乱的代码,你很可能会得到混乱的结果。你可以像你一样使用指向本地人的指针,但除非你清楚地检查自己所做的事情,否则结果也会很糟糕。这是一个可能会有所帮助的方法。

最好的办法是创建某种形式的智能指针,它知道指向内存的指针是否需要删除,并存储这些指针的向量。不知何故,在向量中混合使用局部变量和动态分配的对象感觉是错误的。你是如何做到这一点的?很难回答,但我可以将其归结为糟糕的计划首先,我优化了旧软件,将其用作端口对开本。我在界面引擎中使用了单个向量来单步遍历按钮,有些按钮是通过createButton()中的new创建的,有些是在程序的其他地方创建的。理想情况下,我想它们都应该在createButton()中创建@westr:现在,您要删除每个动态分配的对象两次--一次是在将其推送到向量上之后,然后是在循环中。这是无效的。一旦删除指针,具有相同值的任何其他指针都将不可用,因为它们都指向的对象实际上被销毁和释放。And您的
NULL
检查是不必要的--
new
从不返回空指针,而且不管怎样,删除空指针没有任何作用是可以的。您最好创建某种形式的智能指针,它知道指向内存的指针是否需要删除,并存储这些指针的向量。不知何故,使用mi会让人感觉不对劲一个向量中的局部变量和动态分配对象的x。你是如何得出这一点的?很难回答,但我可以把它归结为一开始规划不周,我优化了旧软件,将其用作端口对开本。我使用一个向量逐步通过界面引擎中的按钮,一些按钮是通过creat中的new创建的eButton(),其中一些是在程序的其他地方制作的。理想情况下,我认为它们都应该在createButton()中制作@westr:现在,您要删除每个动态分配的对象两次--一次是在将其推送到向量上之后,然后是在循环中。这是无效的。一旦删除指针,具有相同值的任何其他指针都将不可用,因为它们都指向的对象实际上被销毁和释放。A你的
NULL
检查是不必要的--
new
从不返回空指针,而且不管怎样,删除空指针是好的,它什么也不做。这是一个想法,你是说我可以覆盖我在向量中持有的对象类中的delete操作符吗?挑剔:删除空指针是完全安全的r、 检查§3.7.3.2.3。[编辑:]再次阅读答案,可能是我误解了它,如果你说得更清楚、更明确,那就好了,我被单词的顺序弄糊涂了。@westr:重载该类的delete运算符不会有帮助。a
shared\u ptr
的deleter是另一回事。@Als:reworded,我同意我首先写的是w令人困惑。我编辑了我的问题来展示我现在是如何做到的,堆栈上没有变量,只是指向动态内存。有人能告诉我,在我查看共享内存时,这样做是否安全吗?这是一个想法,你是说我可以覆盖我在向量中持有的对象类中的delete操作符吗?吹毛求疵:这是p非常安全地删除空指针。检查§3.7.3.2.3。[编辑:]再次阅读答案,可能是我误解了它,如果你说得更清楚、更明确,那就好了,我被单词的顺序弄糊涂了。@westr:重载该类的delete运算符不会有帮助。a
shared\u ptr
的deleter是另一回事。@Als:reworded,我同意我首先写的是w令人困惑。我编辑了我的问题来展示我现在是如何做到的,堆栈上没有变量,只是指向动态内存。有人能告诉我这样做是否安全吗
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();