2011-01-14 226 views
0

例如這個類:快速內存分配/範圍問題

class RTPIPv4Address{ 
    public: 
      RTPIPv4Address(int a, int b); 
} 

愚蠢的問題,但...我只是偶然在其初始化類實例一樣,利用例如

RTPIPv4Address adr(2,2); 

現在代碼我想知道,這是否只是通常的另一種語法

RTPIPv4Address* adr = new RTPIPv4Address (2,2); 

或者它有沒有其他影響?例如,由於缺乏一個指針和一個新的(),它是在棧上宣佈像其他本地變量做什麼,然後得到在函數返回釋放,或者它保存在堆中,因此堅持?

在此先感謝

+2

你有[C++書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)嗎? – GManNickG 2011-01-14 17:29:43

回答

3

是,第一個例子是堆棧分配,將有它的析構函數調用,並儘快變量失去範圍釋放。對於局部變量,這通常發生在函數返回時,儘管可以用花括號強制它早先失去範圍。

function 
{ 
    RTPIPv4Address adr(2,2); 

    return; //adr loses scope and destructor is called  
} 

那怎麼它通常在棧上分配以及它失去範圍,但它可能發生其他地方也是如此。

function 
{ 
    if (condition) 
    { 
     RTPIPv4Address adr(2, 2); 

     //do stuff with adr 

    } //adr loses scope and destructor is called 

    //do more stuff 

    return; 

} 
1

第一個例子將堆棧分配的對象。讓堆上的時候,唯一的辦法就是通過new(顯然,malloc或其他低級別的操作,如mmap)。

3

兩個都構造對象但除此之外,是非常不同的。堆棧中的第一個構造,堆中的第二個構造。應儘可能使用第一種形式。第二種形式,如果要使用,只有當你需要的對象持久化,或者是太大,無法在堆棧中。在C++中,new不是「通常」的對象創建形式。

+0

+1此外,當我們使用`new`時,它直接進入一個智能指針,從未手動使用過。 – GManNickG 2011-01-14 17:30:16