2010-11-18 78 views
0

說我做這樣的事情環路創建新指針對象

for(int i = 0; i < 10; i++) 
{ 
    //create a pointer object using new 
    //use the object 
} 

我需要在循環使用後刪除指針對象? 我在想,如果我沒有刪除它,它會繼續創建一個新的對象10次,然後對象就會掛在那裏,吃資源。

回答

4

是的。

當你不再需要它時,你必須刪除你新出現的東西,否則你會得到內存泄漏。

0

如果您非常喜歡,可以使用智能指針(類似Boost的shared_pointer),然後只要指針超出範圍,最後一次對象就會自動刪除。

0

是的,你需要刪除它。但是,對循環的每次迭代進行新的/刪除可能不是最佳選擇 - 您需要提供更多的上下文以獲得更好的建議。

1

從技術上講,您需要刪除它們。

但是。我們有這個驚人的東西叫智能指針,這自動神奇地做到這一點。

for(int i = 0; i < 10; i++) 
{ 
    std::auto_ptr<int> x(new int(10)); 

    // automatically deleted after each iteration. 
} 
+0

我不認爲該聲明將編譯。你需要做'auto_ptr <> x(new int)' – 2010-11-18 20:39:46

+1

@FredOverflow,在這種情況下你是不正確的。@Martin動態分配一個int並將其初始化爲10,而不是分配一個10個整數的數組。 – 2010-11-18 23:31:01

+0

@Nathan:的確是我!感謝您指出,請+1提供您的評論。 – fredoverflow 2010-11-18 23:36:47

5

是的,對於每個new需要有相應的delete。 (。而對於每一個new[]一個delete[]

然而,C++的辦法是避免動態儲存儘可能多的和而採用地方,自動變量

for(int i = 0; i < 10; ++i) 
{ 
    some_class object; 
    //use object 
} // object gets destroyed here automatically 

如果你需要動態分配這個對象(我懷疑,但有這種情況),那麼使用智能指針。一個智能指針將執行delete你,無論你離開其範圍的方式屬於:

for(int i = 0; i < 10; ++i) 
{ 
    smart_ptr<some_class> object(new some_class()); 
    //use object 
} // object gets destroyed here automatically 

當前的標準只知道一個智能指針,名爲std::auto_ptr,這會對你在這個需要什麼案件。下一個標準將帶來更多,其中std::auto_ptr的替代品,名爲std::unique_ptr,以及一個共享所有權語義,名爲std::shared_ptr。您的編譯器/標準庫實際上可能已經支持它們。如果沒有,您可以在boost的許多優秀圖書館中找到它們。


順便說一句,請注意我用++i取代你i++。在int的情況下,這對您的方案沒有任何影響,但有些類型的i++可能會創建不必要的副本。 (如果效率不關心你,爲什麼在C++中編程?)