![](/img/trans.png)
[英]If I use a pointer in a function to populate a list, do I have to delete that pointer at the end of the function in c++?
[英]Do I have to delete pointer even if it is in function stack?
總是刪除指針,即使它只是在函數調用堆棧中? 函數棧釋放時它不消失了嗎?
// just Simple class
class CSimple{
int a;
}
// just simple function having pointer.
void simpleFunc(){
CSimple* cSimple = new CSimple();
cSimple->a = 10;
//.. do sth
delete cSimple; // <<< Always, do I have to delete 'cSimple' to prevent the leak of memory?
}
void main(){
for( int =0 ; i< 10 ; i++){
simpleFunc();
}
}
函數堆棧何時釋放?
當函數返回時,“ CSimple * csimple”確實消失了。
但是,指針與其指向的對象之間存在很大差異。
當指針對象被銷毀時,指針所指向的內容什么也沒有發生。 這里不僅有一個,而且還有兩個對象:
指針。
它指向的是什么。
在這種情況下,指針指向使用new
創建的動態范圍內的對象。
該對象什么也不會發生,否則,您將泄漏內存。
因此,該對象需要delete
d。
了解並充分理解這個概念之后,下一步就是打開C ++書籍,進入有關std::unique_ptr
和std::shared_ptr
類的章節,這將處理這些令人討厭的細節,為了你。 您應該學習如何使用它們。 現代的C ++代碼很少需要delete
某些內容。 這些智能指針可以完成所有工作。
是。
在范圍退出時(例如,當函數存在或塊{...}完成時),在堆棧上創建的所有對象將被銷毀,內存將被釋放。
這適用於您的情況,即。 指針將被銷毀,並且指針所占用的內存將被釋放。 指針指向的對象將不會被清除。
當您處理多個流路徑(if-else階梯,許多return語句)和異常時,這是一個普遍的問題,也是一場噩夢。
為了解決這個問題,我們采用了兩種主要策略:
std::unique_ptr
, boost::scoped_ptr
,舊版std::auto_ptr
等)。 RAII-無需學術考慮-只是在堆棧上創建對象,如下所示:
{
std::string s;
fancy_object obj;
}
當我們退出他的作用域時, obj
和s
析構函數將被稱為duing stack unwinding。 編譯器會確保所有流路都如此,並會為我們保持正確的釋放順序。
如果需要在堆上分配內存,請使用new
,請使用智能指針。
int foo()
{
std::unique_ptr<Object> o(new Object);
... some more code ...
if( something ) { return -1 }
... some more code ...
if( something_else ) { return -2 }
else { not yet }
return 0;
}
如您所見,我們可以使用3個“ exists”離開范圍。 通常,在所有情況下都需要清除內存,這很容易導致人為錯誤。
無需在所有3種情況下手動清除對象,而是依靠自動析構函數調用堆棧上創建的對象。 編譯器會解決。 當我們離開范圍時,將調用std::unique_ptr
析構函數,並在Object
上調用delete
。
不要被聰明的笨蛋所寵愛。 它們不是“慢”,“膨脹”或其他廢話。 智能Poiners的設計沒有訪問開銷,從而增加了額外的安全性。
非常類似的技術用於鎖。 查看std::lock_guard
類。
是的,您必須delete
所指向的數據。
指針本身在堆棧上,不需要刪除。
但是,您可以將cSimple
存儲在堆棧中,然后不必刪除它:
void simpleFunc(){
CSimple cSimple; // no new
cSimple.a = 10; // "." instead of "->"
//.. do sth
// no deletion
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.