こんにちは、newを使用してスタック上に何かを作成している場合は、次のように宣言します。
object *myObject = new object(contr, params);
次のようにこれを宣言する方法はありますか?
object *myObject;
myObject = new object(constr, params);
これは正しいです?
はい、その通りです。しかし、newはスタック上に物を作成するのではなく、ヒープ上に物を作成します。
スタック上にオブジェクトを作成するには、次のようにします。
object myObject(constr, params);
スタック上にオブジェクトを作成する他の方法はありません。スタック上にオブジェクトが作成されると、後で同じ関数で同じ名前でオブジェクトを「再作成」することはできません。
他の人が言っているように、newはヒープ上に*myObjectを作成します。完全を期すために、myObject(*がないことに注意)と呼ばれるオブジェクトへのポインターは、宣言した方法でスタックに存在することを指摘します。関数を終了するとスタック変数がスコープ外になるため、戻る前にオブジェクトを削除するか、有効期間が長い別の変数にポインターを転送する必要があります。関数から戻る前にポインタがスタック変数にあるヒープオブジェクトを削除しないことは、一種の標準的なメモリリークシナリオです(1つだけではありませんが)
はい、それは正しいですが、スタックに割り当てられません。代わりに、ヒープに割り当てます。スタックに割り当てたい場合は、このように宣言します
object myObject(contr,params);
オブジェクトをスタックに配置する場合は、次のように言う必要があります。
object myObject(contr, params);
このコード:
object *myObject;
myObject = new object(constr, params);
...合法で正しい。ただし、myObjectを割り当てるときは、何かに初期化してください。'myObject'自体は'object'のインスタンスではなく、'object'へのポインタのインスタンスであることを忘れないでください。したがって、このポインタを次のように宣言すると、次のようになります。
object *myObject;
...初期化されていないままにしておきます。代わりに、これを行います。
object *myObject = 0;
myObject = new object(constr, params);
...そしてあなたがそれを削除するとき:
delete myObject;
myObject = 0;
人々はあなたがそれを0ではなくNULLに設定すべきだと議論するかもしれませんが、言語に関する限り両方とも問題ありません、そしてこれは主にスタイルとあなたの同僚が慣れているものの問題です。