2012-03-15 84 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(),可能有幫助。