[英]Memory managment in c++
假設我們有兩個C ++代碼片段:
1:
void fun1()
{
if(1)
int a=5;
}
2:
void fun2()
{
if(1)
{
int *b = new int;
b = 5;
delete b;
}
}
它們相等嗎? 程序離開if
塊后, if
a
變量分配的內存已釋放? 如果沒有,何時釋放?
它們不相等。 在fun1
取決於編譯器的優化, a
要么是寄存器,要么是堆棧中的某個位置。 無論哪種方式,它都將超出if“塊”之后的范圍。 在fun2
您的存儲將在堆上。 通常,對於小而短暫的對象, fun1
將遠遠超過fun2
。
功能完成后,“ a”和“ b”都將從內存中釋放。 “ a”將被釋放,因為它離開了作用域,“ b”將被釋放,因為您顯式調用了delete。
它們在內存方面並不相同。 在fun1()中,您將一個int分配給堆棧。 在fun2()中,您在堆棧上分配一個int指針,在堆中分配一個int。 這意味着fun2()稍慢一些,並且使用更多的內存。
假設您在第二個功能中有錯字。
它們相等嗎?
第一個函數幾乎什么都不做,而第二個函數將調用可能重載的new
運算符和可能重載的delete
運算符。 這將分配動態內存並最終釋放它。 更重要的是,第二個函數可能會引發異常。
程序離開if塊后,是否為變量分配的內存已釋放?
如果分配了作用域,則在離開作用域后將在第一個功能中釋放內存。 在第二個示例中,將在執行delete
運算符后釋放內存,但請記住,您將指針作為局部變量,其作用與第一種情況相同。
{ ... }
被稱為復合語句 。 如果在if
語句中省略了花括號,則附帶的語句仍然是復合語句。 復合語句具有塊作用域 。 這意味着具有自動存儲功能的變量在塊作用域末尾被銷毀。
void fun1()
{
if(1)
int a=5; // a destroyed at semi-colon
}
void fun2()
{
if(1)
{
int *b = new int;
b = 5;
delete b;
} // b destroyed at brace
}
分配有new int
的內存的生存期與b
的存儲持續時間無關。 這就是為什么建議使用智能指針的原因之一,因此您不必擔心破壞由b
管理的內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.