問題のコードは、 のコピーを作成MyClass
しますstd::vector
。メソッドが終了すると、オリジナルm
は破棄されます。Test
ポインターを格納するようにベクトルを変更する場合、MyClass
2 つの選択肢があります。
void Test( std::vector<MyClass*>& myvec )
{
// Allocates a new MyClass on the heap.
MyClass* pM = new MyClass();
myvec.push_back(pM);
// This variable will be allocated on the stack and cleaned up on method exit
MyClass dontDoThis;
myvec.push_back(&dontDoThis);
}
このメソッドの最後には、 と のmyvec
2 つの要素がmyvec[0]
ありmyvec[1]
ます。
ポインタのコンテナが格納されている場合、ポインタがコンテナ内にある間有効であるように、オブジェクトを割り当てる必要があります。上記の例では、ポインターはメソッドの終了pM
後に有効になります。Test
これはmyvec[0]
、メソッドが終了した後に有効なポインターになることを意味します。
最初に、dontDoThis
変数への有効なポインターがベクターに追加されますが、メソッドが終了すると、のデストラクタdontDoThis
が呼び出され、メモリはおそらく他のデータを格納するために使用されます。のポインターは問題ないようにmyvec
見えますが、実際に使用しようとすると、未定義の動作が発生します。メソッド exit のポインタはmyvec[1]
有効に見えるかもしれませんが、実際にはジャンクを指しています。
後でmyvec[0]
が変更または削除された場合は、次のように呼び出すことが重要です。
delete myvec[0]
オブジェクトが適切にクリーンアップされるようにします。そうしないと、メモリ リークが発生します。
ネイキッド ポインターで何が起こるかを説明した後、std::unique_ptrやstd::shared_ptrなどのスマート ポインターを使用することを強くお勧めします。