生の新所有権を指定していません。私が新しいものを作り、それを返すのであれば、誰がそれを所有していますか?作成する関数/オブジェクトがそれを所有しているのですか?スマートポインタ(std :: shared_ptrとstd :: unique_ptr)を返すと、所有権が指定されます。
所有権を指定しないと、メモリをリークする最も簡単な方法の1つです。私は、プロのプログラマーであっても、人々に所有権を理解させ、それを使用してもらうのが最も難しい時期です。これは、所有権を指定する良い型(スマートポインタ)を使用することによって、ほとんどの場合防止されます。
これらの異なるタイプのポインタは、既存の生ポインタとはちょうど同じ所有権を表します。
new
は常に間違っています。それは過大な一般化です。std::shared_ptr
は、グローバル関数std::make_shared
を使用して作成されます。 C++ 11では、std::make_unique
はありませんが、C++ 14で修正されます。 std::unique_ptr
を作成する唯一の方法は、新しくを使用することです。std::unique_ptr
にポインタを割り当てます。
生ポインタを使用し、手動でnew
とdelete
を使用する場所もありますが、それらは非常に低いレベルになりがちで、ほとんどのプログラマはほとんど遭遇しません。本当に私はあなたのコードについてたじたじしている何
あなたがnew
を使用していることはありませんが、あなたはポインタを逆参照し、参照に代入されます。デストラクタが呼び出されることを保証することはほとんど不可能です。また、メモリがリークする傾向がありますが、静的変数に割り当てる場合、プログラムの終了時に割り当てが解除されるため、メモリリークを実際には見ていません。
私は静的変数を参照よりも値で設定することをお勧めします。これにより、オブジェクトをヒープ上に置くことができなくなります。また、MyClass
に応じて、オブジェクトを初期化するためのコードを実行することなく、オブジェクトを実行可能ファイルからメモリにマップすることもできます。
MyClass& MyClass::MyInstance()
{
static MyClass myLocalVariable(/*parameters*/);
return myLocalVariable ;
}
これは正確にどのように削除されますか? – Nim
origianlの質問では、私はバニラポインタではなく、std :: shared_ptrを使うことについても話しました。 –
'new'の場合は' delete'が必要です。この場合、あなたはできません。 – crashmstr