2013-10-22 53 views
1

什麼是分配給char *ptr內存:編譯器提供複製CTOR

#include <iostream> 
using namespace std; 
class A 
{ 
    private: 
    int count; 
    char *ptr;         
    public : 
    void print() 
    {  
    cout << "Addr " << &ptr << endl;  
    cout << "Addr " << *ptr << endl;  
    }  

}; 

int main() 
{ 
A obj; 
obj.print(); 
A *obj1 = new A(obj); 
obj1->print(); 
cin.get();    
return 0; 
} 

我使用編譯器提供的拷貝構造函數。我有興趣瞭解多少內存將分配給*ptr

+0

它只是'char *'使用的內存,即sizeof(char *)'字節。 – juanchopanza

+0

你提供的例子不會被編譯,因爲'ptr'永遠不會被初始化,所以'cout <<「Addr」<< * ptr << endl;'會出現段錯誤 –

+2

@MattClarkson這兩個錯誤 - 它會編譯但會產生未定義的行爲。 –

回答

5

有多少內存?好吧,根本沒有。你所有的是一個單元化的char*,本身佔用sizeof(char*)字節的內存。您將需要自己分配內存(可能使用new)並將該內存分配給ptr。一旦完成後,不要忘記釋放內存(或許用一個delete);通常在析構函數中完成。

更好的是,請使用std::string,它爲您處理所有的內存。 (P.S.技術上行cout << "Addr " << *ptr << endl;給你未定義的行爲,因爲你是解除引用單位化指針)。

+0

這是[示例](http://coliru.stacked-crooked.com/a/72c98d8756957cb9) –

+1

'obj1'不是堆棧分配。所以它也不是'ptr'成員。 – juanchopanza

+0

@Juanchopanza:好點。已經刪除:在回答範圍外指出obj和obj1之間的區別。 – Bathsheba

1

單獨使用char *將佔用32位機器上的4個字節,64位機器上的8個字節。當您分配一個內存(可能使用new進行分配)到ptr時,只能將內存地址存儲在ptr中,並且實際內存將分配到堆上。

相關問題