2010-05-12 129 views
8

如果一個類被聲明如下:堆/堆棧上的類成員分配?

class MyClass 
{ 
    char * MyMember; 
    MyClass() 
    { 
    MyMember = new char[250]; 
    } 
    ~MyClass() 
    { 
    delete[] MyMember; 
    } 
}; 

而且它可以這樣做:

class MyClass 
{ 
    char MyMember[250]; 
}; 

如何做一個類被分配在堆,就像如果我做MyClass * Mine = new MyClass(); 是否分配內存還會在第二個示例中分配250個字節以及類實例嗎?該成員是否會在MyClass對象的整個生命週期內有效? 至於第一個例子,在堆上分配類成員是否可行?

+0

[類成員和明確的堆棧/堆分配](的可能的複製https://stackoverflow.com/questions/10836591/class-members-and-explicit-stack-heap-分配) – 2017-11-12 14:50:45

回答

7

是的,是的,是的。但是,你的第一個例子中有一個缺陷:這是因爲它的一個數據成員是一個帶有堆分配數據的指針,那麼它也應該聲明一個複製構造函數和賦值運算符,例如像...

MyClass(const MyClass& rhs) 
{ 
    MyMember = new char[250]; 
    memcpy(MyMember, rhs.MyMember, 250); 
} 
+0

感謝您的提示,我會考慮更頻繁地使用此技術。 – SimpleButPerfect 2010-05-12 16:01:43

+2

雖然技術上克里斯是正確的,但這不是一個好主意。改爲使用std :: vector ,並且您的所有內存管理都已處理完畢。要查看完整的詳細信息:http://stackoverflow.com/questions/255612/c-dynamically-allocating-an-array-of-objects/255744#255744 – 2010-05-12 19:12:24

+1

這個問題不是關於數組,我應該改變這個例子是關於分配本身的概念。 – SimpleButPerfect 2010-05-13 05:28:03

1

當你調用new它從堆中分配,否則它從堆棧分配(我們將忽略malloc及其他)。

在第一個示例中,在MyClass實例(假設爲32位指針)和分配給MyMember的緩衝區的堆上有250字節的堆棧中將分配4個字節的空間。

在第二個示例中,MyClass實例將在堆棧上分配250個字節。在這種情況下,MyMember被視爲實例的偏移量。

+1

這是不正確的,在第二個例子中,該類包含250個字符的數組。如果你做類似'MyClass * foo = new MyClass'的所有內容都會堆在堆上啊'' – Hasturkun 2010-05-12 16:19:33

+0

啊 - 我沒有看到'new MyClass'(或者OP在「edits does not get noted」中添加了它)大體時間)。所以這個答案在問題上並不完全正確。但不幸的是,我無法刪除它。 – Anon 2010-05-12 16:58:48

3

提示:使用std::string而不是分配char []的堆。

分配的內存是否也在第二個示例中分配了250個字節以及類實例?

它將被堆放在構造函數中分配,與分配MyClass的堆棧中的方式相同。這取決於你的意思是「一起」,它不一定會一起分配。

而且該成員是否會在MyClass對象的整個生命週期內有效?

是。

至於第一個例子,在堆上分配類成員是否實用?

是的,在某些情況下。有時候你想盡量減少頭文件中的包含,有時你會使用工廠函數來創建成員。通常情況下,我只需要一個簡單的非指針成員。

+0

感謝您提供這樣一個詳細的答案,至於早期筆記,我只是想收集有關該主題的知識。 – SimpleButPerfect 2010-05-12 15:58:24