簡體   English   中英

C ++中的內存管理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM