プレーン・オールド・データ型とオブジェクトをメンバとする通常の構造体(またはクラス)を用意します。デフォルトコンストラクタは定義されていないことに注意してください。make_sharedは、各メンバ変数のデフォルトの初期化(ゼロ初期化)を行いますか?
struct Foo
{
int x;
int y;
double z;
string str;
};
は、今は、スタック上のfのインスタンスを宣言し、その内容を印刷しようとすると:
{
Foo f;
std::cout << f.x << " " << f.y << " " << f.z << f.str << std::endl;
}
結果は、x、yおよびzのための印刷されたごみデータです。文字列はデフォルトで空になるように初期化されています。 期待通りです。
Iはmake_shared
と印刷を使用してshared_ptr<Foo>
のインスタンスを作成する場合:
{
shared_ptr<Foo> spFoo = make_shared<Foo>();
cout << spFoo->x << " " << spFoo->y << " " << spFoo->z << spFoo->str << endl;
}
そして、x、yおよびzはすべて0
です。これにより、オブジェクトインスタンスが構築された後、shared_ptr
が各メンバに対してデフォルトの初期化(ゼロ初期化)を実行するようになります。少なくとも私はVisual Studioのコンパイラでこれを観察しています。
この標準はC++ですか?または、すべてのコンパイラ間でゼロ初期化の動作を保証するために、明示的なコンストラクタまたは明示的な={}
ステートメントをインスタンス化した後に行う必要がありますか?
実践的な質問:これに頼ることができるかどうか、または回避する*方法が*必要か? – Yakk
前者。私はそれが異なるコンパイラに依存することができるような標準的な動作であることを確認したかったのです。 – selbie