2012-10-21 474 views
3
#include <iostream> 
using namespace std; 

class test 
{ 
public: 
    int a,b[100]; 
    test() { 
     cout << "Constructor called" << " \n " ; 
     a=10; 
    } 
}; 

int main() 
{ 
    test a1;  
    test *b2;  
    test *pointer = new test; 

    cout << a1.a << endl; 
    cout << pointer->a << " \n "; 
    cout << b2->a << " \n "; 

    return 0; 
} 

我想知道是否只有兩個對象是由上面的代碼創建'a1'對象和'指針'對象指針。我假設指針'b2'沒有獲得分配給它的內存。在這種情況下,最後的「cout < b2-> a」應該會產生分段錯誤。我正在訪問我沒有分配內存的位置。但我沒有得到分段錯誤。編譯器只是打印一個隨機值。對象指針的C++內存分配

我的問題是「是三個對象分配內存還是隻有兩個」? 爲什麼沒有分段錯誤?

+0

只有兩個對象,當你測試* b2;這只是一個指針,並且只會分配內存,就像它會爲32位的普通指針所做的那樣。 – AlexDan

回答

4

a1被分配在自動存儲器中。

b2不是一個對象(好吧,不是你定義的類型的對象),而是一個指針,它不指向一個有效的位置。這是一個懸掛指針,取消引用它會導致未定義的行爲。任何事情都可能發生。

pointer是一個指向動態內存中的對象的指針。它本身不是一個對象,但它指向由new test創建的對象。

都在這裏分配的內存三個對象或只有兩個

只有兩個。

爲什麼沒有分段錯誤?

因爲未定義的行爲意味着會發生任何事情。任何行爲都符合標準。

+2

那麼,一個指針仍然是一個對象,一個指針類型的對象。但我知道你的意思和你說的方式,無論如何它可能更好地理解OP。 –

+0

@Luchian,@ Christian - 非常感謝。據我所知,404字節(int爲4字節)被分配到'a1'的自動存儲器中,404字節被'pointer'指向的'new test'在動態存儲器中分配。指針'b2'和'指針'在自動存儲器中僅分配了32位用於存儲地址。如果我錯了,請告訴我。 – Raghav

+0

@Raghav這是一個實現細節,可能會有所不同(sizeof(int)不一定是4),但yup,類似的東西。 –