2016-10-30 90 views
-2

在C++中,創建一個對象而不調用像這樣的構造函數。這是否按照定義的行爲計算? (忽略不確定的堆內存)沒有構造函數調用的C++對象創建

class Foo { 
public: 
    int *ptr; 
    int a, b; 

    Foo() { ptr = new int{}; } 
    ~Foo() { delete ptr; } 
    void set(int a_, int b_) {a = a_; b = b_;} 
    void print() { std::cout << *ptr << a << b; } 
}; 

int main() { 
    char *array[sizeof(Foo)]; // note the pointer 
    *((int**)array) = new int{3}; 
    ((Foo*)array)->set(1, 2); 
    ((Foo*)array)->print(); // 312 
} 
+8

不,這是完全和完全未定義的行爲,由於太多不同的原因列出。 –

+2

您並未創建對象,只是將現有的內存位置投射到對象。 – Robert

+0

標準C++語法有什麼問題? –

回答

2

您正在構建一個內存塊,可以保存該對象的數據,但這不是一個對象。

一個對象可能遠遠超過那片內存,更多的是由編譯器決定的。它可能沒有更多,但它可能是很多其他的事情。

+0

作爲附錄:如果你打算這樣做,你會想找到你的編譯器選項來顯示類的佈局,你的代碼很可能是平臺相關的。 MSVC使用'/ d1reportSingleClassLayoutX',其中'X'是類的名稱(或其名稱的一部分)。 Clang使用'-Xclang -fdump-record-layouts',據我所知,在生成佈局之前(或者只是輸出),你至少需要實例化類。 –

相關問題