2012-07-05 27 views
0

我有一個類分配類中的成員變量在哪裏?

class Sample 
{ 
    string strName; 
}; 

如果我創建使用Sample *obj = new Sample()哪裏串strName創建示例對象?它是堆棧還是堆?

+0

C++標準沒有定義「堆棧」和「堆」,因此理論上它取決於編譯器,只要保留生命週期語義。而且,'std :: string'可以在任何想要的地方保存它的實際數據。 – Vlad 2012-07-05 11:15:23

回答

4

沒有,因爲Sample obj = new Sample()不會編譯。

如果您的意思是Sample* obj = new Sample(),那麼它是在動態存儲(堆)中。

當您撥打delete obj時,即使它位於堆上,字符串也會自動刪除。

+0

對不起編輯我的帖子 – Jeeva 2012-07-05 11:05:58

+0

@Jeeva答案仍然適用。 – 2012-07-05 11:06:23

2

整個og obj在「堆」上,其數據成員也是如此。但是,您不必擔心管理分配給數據成員的內存。刪除obj也會照顧字符串。

+0

「堆」:)) – 2012-07-05 11:07:36

1

無論分配哪個類,都會使用該類創建結構體,數組,指針和基本數值類型。

字符串更復雜。它們是一種容器。定義容器的字符串成員將作爲樣例類中的成員存儲在類的內存塊中。字符串的文本可能會被分配到堆上的其他地方(取決於字符串類的實現)。

現在,如果你做Sample* blah = new Sample();那麼operator new將在堆中分配內存(如果指針最初是堆中類的成員,則指針將位於堆棧上或堆上)。
如果你只是把它作爲一個變量,它會被存儲在堆棧上:Sample blah;

+0

*現在,如果你做Sample * blah = new Sample();那麼operator new將在堆中分配內存(指針將在堆棧中)。*如果指針是在堆本身上創建的類的成員,則不適用! ** Heapception ** – 2012-07-05 11:14:46

+0

沒錯。補充說。很難想到每一個例子,當試圖徹底:) – 2012-07-05 11:17:37

1

strName將被放置在您的Sample對象放置。然而,類string可能會引用它所喜歡的任何存儲,是否使用正常變量(然後再將它們放在放置位置的地方,指向某些東西的指針(內存映射)始終只是從其他位置查詢XML接口地球的一側。

然而,string具有以某種方式存儲地址,因此,例如其的指針或引用或網址或任何尋址方案被使用,置於其中string放置。


相關經驗法則:指針本身的價值(我爲什麼在對象複製情況下很難正確處理)。