2014-02-17 72 views

回答

12

所有對象都有關聯的存儲持續時間。存儲持續時間描述對象的存儲保持多久。不是引用的局部變量引入了具有自動存儲持續時間的對象,這意味着這些對象的存儲在其作用域的末尾自動銷燬。

引用類型變量不會引入對象,甚至可能不需要自己存儲,但它們仍具有存儲期限(§3.7/ 3)。如果參考文件確實需要存儲,則會根據參考文獻的存儲時間進行發佈。

因此,任何一種局部變量聲明都不會泄漏。實際上,您不能使用delete自動存儲持續時間的對象。這僅用於具有動態存儲持續時間的對象,這些對象使用new進行分配。

+0

這仍然讓它打開引用變量的事情。它們不是物體,但它們也不會造成韭菜。 –

+0

@KerrekSB指針和引用都不會導致韭菜;只有動態分配纔會導致韭菜。但是,如果你寫了'MyType&var = * new MyType'之類的東西,你也可以使用引用來泄漏。 –

+0

@JamesKanze:我意識到這一點。我指的是'var'本身佔用的空間。答案似乎沒有涵蓋它,因爲'var'不是一個對象。 –

3

自動刪除在堆棧上分配的局部變量,即不使用內存分配函數或像mallocnew這樣的運算符。所有其他變量必須使用delete刪除,因爲它們存儲在堆中。

+0

簡單解釋。謝謝! – Acidic

4

如果手動分配內存你必須刪除它,只要你需要,

實施例:

char* foo() 
{ 
    char* manually_allocated_char = new char(); // this will 'live' outside the function 
    char autamically_allocated = 'a'; // this will be 'deleted' 
    return manually_allocated_char; 
} 


void main() 
{ 
    char* a_new_char = foo(); 
    delete a_new_char; // You must free memory you have allocated for not having memory leaks 
} 
+1

請注意,此示例僅適用於說明;儘量不要努力通過這種方式來編寫代碼。一般來說,儘量保持你的'新'和'刪除'在一起。如果你不能這樣做,絕對必須做這樣的事情,然後評論評論評論! – jia103

+0

靜態變量呢?他們倖免於範圍的結束。當他們不再需要時,我必須刪除它們嗎? –

+0

@MatheusRocha,它取決於,如果你想讓函數「更好地記住某些狀態」(如果你使用'new'運算符),對於其他靜態分配的變量而不使用'new',它並不是必須的。 – Netwave

3

動態分配的內存使用malloc,realloc的,新的和新的[]必須被刪除。這些都在堆內存中。其他人會自動解除分配。

+0

另請注意,使用智能指針或auto_ptr時,您仍然使用新的堆分配動態內存,但自動爲您處理清理。 – jia103

+0

在這種情況下,使用'malloc'或'new'的真正優勢是什麼? –

相關問題