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?
Praktische Frage: Wollen Sie eine * Garantie *, auf die Sie sich verlassen können, oder eine * Möglichkeit, dies zu vermeiden *? – Yakk
Das ehemalige. Ich wollte sicherstellen, dass es Standardverhalten ist, so dass es sich auf verschiedene Compiler verlassen kann. – selbie