如果不是這意味着我將不得不通過刪除所有局部變量來結束每個函數,如果我想防止100%的內存泄漏?函數結束時,它的局部變量是否被釋放?
回答
所有對象都有關聯的存儲持續時間。存儲持續時間描述對象的存儲保持多久。不是引用的局部變量引入了具有自動存儲持續時間的對象,這意味着這些對象的存儲在其作用域的末尾自動銷燬。
引用類型變量不會引入對象,甚至可能不需要自己存儲,但它們仍具有存儲期限(§3.7/ 3)。如果參考文件確實需要存儲,則會根據參考文獻的存儲時間進行發佈。
因此,任何一種局部變量聲明都不會泄漏。實際上,您不能使用delete
自動存儲持續時間的對象。這僅用於具有動態存儲持續時間的對象,這些對象使用new
進行分配。
這仍然讓它打開引用變量的事情。它們不是物體,但它們也不會造成韭菜。 –
@KerrekSB指針和引用都不會導致韭菜;只有動態分配纔會導致韭菜。但是,如果你寫了'MyType&var = * new MyType'之類的東西,你也可以使用引用來泄漏。 –
@JamesKanze:我意識到這一點。我指的是'var'本身佔用的空間。答案似乎沒有涵蓋它,因爲'var'不是一個對象。 –
如果手動分配內存你必須刪除它,只要你需要,
實施例:
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
}
動態分配的內存使用malloc,realloc的,新的和新的[]必須被刪除。這些都在堆內存中。其他人會自動解除分配。
另請注意,使用智能指針或auto_ptr時,您仍然使用新的堆分配動態內存,但自動爲您處理清理。 – jia103
在這種情況下,使用'malloc'或'new'的真正優勢是什麼? –
- 1. PHP在函數結束後立即釋放局部變量嗎?
- 2. 分配alloca的內存在函數結束或範圍結束時被釋放?
- 3. 我是否需要釋放局部變量?
- 4. 數組在c函數結束後被釋放了嗎?
- 5. 我需要釋放局部變量嗎?
- 6. 函數結束時是否清除本地函數變量的內存?
- 7. 分配了malloc或calloc的內存是否在函數結束時被釋放了?
- 8. 循環內部的局部變量是否被垃圾收集?
- 9. 匿名函數中的局部變量是否存在?
- 10. 何時釋放指針在C和如何知道它是否被釋放
- 11. objective-c何時應該釋放靜態局部變量
- 12. 在JavaScript中,當局部變量被提起時,甚至在它被聲明之前它是否在範圍內?
- 13. 否結束時播放結束
- 14. 即使將它變成全局變量也不被識別爲外部函數
- 15. 是釋放內存當PHP函數結束
- 16. malloc會在函數結束時自動釋放內存嗎?
- 17. 是否可以檢測函數中聲明的局部變量的數量?
- 18. 它被認爲是全局變量嗎?結構和鏈表
- 19. 從函數傳遞局部變量變爲全局變量
- 20. 在函數內部訪問被重寫的全局變量
- 21. 訪問全局函數的變量在局部函數
- 22. 訪問函數的局部變量
- 23. 函數中的gdb局部變量
- 24. 查找main函數的局部變量
- 25. 傳遞函數中的局部變量
- 26. 獲取函數的局部變量
- 27. 是否[=]暗示所有局部變量將被複制?
- 28. 靜態局部變量是否可以被錯誤地優化?
- 29. 正確的方法來檢查局部變量是否等於局部變量
- 30. 是否需要釋放函數返回的變量的內存(C)?
瞭解本地範圍對於「獲取」C++至關重要。在其中找一個帶有「範圍」和「析構函數」的教程。 –