2016-10-30 3 views
-2

In C++, Erstellen eines Objekts ohne Aufruf eines Konstruktors wie diesem. Zählt das als definiertes Verhalten? (Disregard die unfreed Heapspeicher)C++ Objekterstellung ohne Konstruktoraufruf

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

Nein, das ist völlig und völlig undefiniert Verhalten, für zu viele verschiedene Gründe aufzulisten. –

+2

Sie erstellen kein Objekt, sondern nur einen vorhandenen Speicherort für das Objekt. – Robert

+0

Was stimmt nicht mit der Standard-C++ - Syntax? –

Antwort

2

Sie bauen einen Speicherblock, der die Daten für das Objekt halten kann, aber das ist kein Objekt.

Ein Objekt besteht aus potenziell viel mehr als dieser Teil des Speichers, und was mehr ist, ist der Compiler. Es könnte nichts mehr sein, aber es könnte eine Menge anderer Dinge sein.

+0

Als ein Addendum: Wenn Sie das tun, müssen Sie die Option Ihres Compilers zum Anzeigen von Klassenlayouts finden, und Ihr Code wird sehr wahrscheinlich plattformabhängig sein. MSVC verwendet '/ d1reportSingleClassLayoutX', wobei' X' der Name der Klasse (oder ein Teil ihres Namens) ist. Clang verwendet '-Xclang -fdump-record-layouts', und meines Wissens müssen Sie die Klasse mindestens einmal instanziieren, bevor sie das Layout erzeugen (oder vielleicht nur ausgeben). –