2017-07-28 6 views
9

Nehmen Sie eine normale Struktur (oder Klasse) mit einfachen alten Datentypen und Objekten als Mitglieder. Beachten Sie, dass kein Standardkonstruktor definiert ist.Macht make_shared eine Standardinitialisierung (Zero-Init) für jede Elementvariable

struct Foo 
{ 
    int x; 
    int y; 
    double z; 
    string str; 
}; 

Wenn ich nun erklären f eine Instanz auf dem Stapel und versuchen, seinen Inhalt zu drucken:

{ 
    Foo f; 
    std::cout << f.x << " " << f.y << " " << f.z << f.str << std::endl; 
} 

Das Ergebnis ist eine Datenmüll gedruckt für x, y und z. Und die Zeichenfolge wird standardmäßig initialisiert, um leer zu sein. Wie erwartet.

Wenn ich eine Instanz eines shared_ptr<Foo> Verwendung make_shared und Druck:

{ 
    shared_ptr<Foo> spFoo = make_shared<Foo>(); 
    cout << spFoo->x << " " << spFoo->y << " " << spFoo->z << spFoo->str << endl; 
} 

Dann, x, y und z sind alle 0. Dadurch wird angezeigt, dass shared_ptr eine Standardinitialisierung (Zero Init) für jedes Mitglied ausführt, nachdem die Objektinstanz erstellt wurde. Das sehe ich zumindest mit dem Compiler von Visual Studio.

Ist dieser Standard für C++? Oder wäre es notwendig, nach der Instanziierung einen expliziten Konstruktor oder eine explizite ={}-Anweisung zu haben, um das Zero-Init-Verhalten in allen Compilern zu garantieren?

+0

Praktische Frage: Wollen Sie eine * Garantie *, auf die Sie sich verlassen können, oder eine * Möglichkeit, dies zu vermeiden *? – Yakk

+0

Das ehemalige. Ich wollte sicherstellen, dass es Standardverhalten ist, so dass es sich auf verschiedene Compiler verlassen kann. – selbie

Antwort

8

Wenn Sie z.B. this std::make_shared reference Sie werden sehen, dass

Das Objekt, als ob durch den Ausdruck konstruiert ist ::new (pv) T(std::forward<Args>(args)...), wo pv sind ein internen void* Zeiger auf Speicher geeignet T ein Objekt des Typs zu halten.

Das bedeutet std::make_shared<Foo>() im Grunde tut new Foo(). Das heißt, es value initializes die Struktur, die zur Nullstellung der Nicht-Klassenmitgliedsvariablen führt.

Verwandte Themen