2011-12-19 28 views
0

有代碼:可能是一個在堆上創建的對象,被視爲在C++中處於堆棧狀態?

struct FooBar 
{ 
    FooBar() 
    { 
    MyObject obj; 

    /// when c-tor is ended, obj must be deleted through d-tor call 
    } 
}; 
... 
FooBar* fooBar(new FooBar); 

fooBar是在堆上分配。但是FooBar裏的對象MyObject obj的構造函數不知道它在哪裏創建。那麼可以在FooBar的上下文中處理它是否在實例化中被創建爲堆棧?

在堆上分配的對象是否有自己的堆棧?這種堆棧的大小是多少?

回答

6

obj在您的示例(「普通」堆棧中,與在代碼中使用的「相同」中調用new FooBar--假設您的環境有一個堆棧開始)的堆棧上進行分配。

this指向堆上某處的事實不會改變構造函數是(相對)普通函數調用並使用與其他函數相同的堆棧的事實。

+0

我是否正確地知道創建obj的堆棧和指向FooBar的指針所在的堆棧是否相同? – barankin 2011-12-19 07:31:27

+1

最有可能的是。 (但這些都不能保證是標準的 - 堆棧和堆是實現的細節,你不應該擔心這種類型的細節。) – Mat 2011-12-19 07:33:15

+0

只是最後一刻。所以在這種情況下,如果MyObject被分配在堆的'FooBar'內,則會分配一個大型的數組'double size [1000000]'這會產生一個關於[stack]內存不足的錯誤嗎? – barankin 2011-12-19 07:53:47

4

C++不知道堆棧或堆。它確實知道具有自動和動態存儲持續時間的對象。在你的情況下,fooBar具有動態存儲持續時間(因爲它是使用new創建的)。它會一直活着,直到您撥打delete就可以了。 obj具有自動存儲持續時間(因爲它不是使用new創建的)。當封閉函數(FooBar-constructor)結束時,它的生命週期結束。

相關問題