2012-03-15 85 views
0

说我有一个向量,其中包含指向动态内存的指针,但也包含在堆栈中声明的变量的地址,是否有一种方法可以安全地循环访问并仅删除动态内存,还是仅限于使用其中一种?或者正在做以下安全?我想也许根据编译器的结果是不可预测的。std向量保存指针和变量地址。清理?

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

最好的办法是创建一些形式的智能指针,它知道指向内存是否需要删除,并存储这些指针的向量。 – Nick 2012-03-15 10:49:00

+0

不知何故,在一个向量中混合使用局部变量和动态分配的对象感觉不对。你如何来到这一点? – 2012-03-15 10:59:39

+0

它很难回答,但我可以把它放在一开始就糟糕的计划,即时优化旧软件作为端口作品集使用。我使用一个单独的矢量来遍历界面引擎中的按钮,一些按钮是通过createButton()中的new创建的,有些是在程序中的其他位置创建的。理想情况下,我想他们应该都在createButton(); – 2012-03-15 11:16:51

回答

3

您只能删除一个指针是的new无论是结果还是一个空指针。 &j不是new的结果,也不是空指针。

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

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

+0

多数民众赞成在想,你是说我可以重写对象的类中的删除操作符在向量中持有? – 2012-03-15 10:54:12

+0

* nitpick:*删除一个空指针是完全安全的。检查**§3.7.3.2.3**。 [编辑:]再次阅读答案,也许我误解了它,如果你更清楚明确地陈述它会很好,我被这些单词的顺序弄糊涂了。 – 2012-03-15 10:57:36

+0

@westr:重载类的delete操作符将无济于事。 'shared_ptr'的删除器是另一回事。 – 2012-03-15 11:15:30

1

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