我有一個類分配類中的成員變量在哪裏?
class Sample
{
string strName;
};
如果我創建使用Sample *obj = new Sample()
哪裏串strName
創建示例對象?它是堆棧還是堆?
我有一個類分配類中的成員變量在哪裏?
class Sample
{
string strName;
};
如果我創建使用Sample *obj = new Sample()
哪裏串strName
創建示例對象?它是堆棧還是堆?
沒有,因爲Sample obj = new Sample()
不會編譯。
如果您的意思是Sample* obj = new Sample()
,那麼它是在動態存儲(堆)中。
當您撥打delete obj
時,即使它位於堆上,字符串也會自動刪除。
對不起編輯我的帖子 – Jeeva 2012-07-05 11:05:58
@Jeeva答案仍然適用。 – 2012-07-05 11:06:23
整個og obj
在「堆」上,其數據成員也是如此。但是,您不必擔心管理分配給數據成員的內存。刪除obj
也會照顧字符串。
「堆」:)) – 2012-07-05 11:07:36
無論分配哪個類,都會使用該類創建結構體,數組,指針和基本數值類型。
字符串更復雜。它們是一種容器。定義容器的字符串成員將作爲樣例類中的成員存儲在類的內存塊中。字符串的文本可能會被分配到堆上的其他地方(取決於字符串類的實現)。
現在,如果你做Sample* blah = new Sample();
那麼operator new將在堆中分配內存(如果指針最初是堆中類的成員,則指針將位於堆棧上或堆上)。
如果你只是把它作爲一個變量,它會被存儲在堆棧上:Sample blah;
*現在,如果你做Sample * blah = new Sample();那麼operator new將在堆中分配內存(指針將在堆棧中)。*如果指針是在堆本身上創建的類的成員,則不適用! ** Heapception ** – 2012-07-05 11:14:46
沒錯。補充說。很難想到每一個例子,當試圖徹底:) – 2012-07-05 11:17:37
strName
將被放置在您的Sample
對象放置。然而,類string
可能會引用它所喜歡的任何存儲,是否使用正常變量(然後再將它們放在放置位置的地方,指向某些東西的指針(內存映射)始終只是從其他位置查詢XML接口地球的一側。
然而,string
具有以某種方式存儲地址,因此,例如其的指針或引用或網址或任何尋址方案被使用,置於其中string
放置。
相關經驗法則:指針本身的價值(我爲什麼在對象複製情況下很難正確處理)。
C++標準沒有定義「堆棧」和「堆」,因此理論上它取決於編譯器,只要保留生命週期語義。而且,'std :: string'可以在任何想要的地方保存它的實際數據。 – Vlad 2012-07-05 11:15:23