私はマップを使用して、ここで期待するようになぜコンストラクタが呼び出されてコピーされていませんか?

StackOverflow https://stackoverflow.com/questions/2367487

  •  23-09-2019
  •  | 
  •  

質問

私がのstd ::マップで自分のカスタムクラスを使用して問題を抱えています。メンバーのための動的割り当てメモリクラス、そして私は、私はクラスがすべて割り当てられたメモリを削除するの面倒を見るようにしたいので、マップ内のポインタを使用する必要はありません。しかし、私が午前問題は、コードのブロックがスコープの外に出たとき、私は、それがマップに残っているにもかかわらず、呼び出されたデストラクタオブジェクトをマッピングするための項目を追加した後です。私は私が何を意味するかすることを示している以下のコードの偽のビットを作りました。出力は次のようになります。最終的にデストラクタが呼び出されている理由の問題があるので?長い質問を事前に感謝し、申し訳ありません。

Constructor Called Num:0034B7E8
Default Constructor Called Num:00000000
Copy Constructor Called Num:CCCCCCCC
Copy Constructor Called Num:CDCDCDCD
destructor called Num:CCCCCCCC
destructor called Num:00000000
destructor called Num:0034B7E8
Inserted Num:0034B7E8



class myClass
{
public:
  myClass(int num) 
  {
     mnNum = new int();
     cout << "Constructor Called Num:" << mnNum << endl;
   }

   myClass() : mnNum(NULL)
   {
      cout << "Default Constructor Called Num:" << mnNum << endl;
   }

   myClass(const myClass &copy) 
   {
      mnNum = new int(copy.mnNum);
      cout << "Copy Constructor Called Num:" << mnNum << endl;
   }

   ~myClass()
   {
      delete mnNum;
      mnNum = NULL;
   }

   int* mnNum;

 };

 map<string,myClass> mvMyMap;

 void testFunction()
 {
     myClass lcObj(1);

     mvMyMap["Test"] = lcObj;
 }


 int _tmain(int argc, _TCHAR* argv[])
 {
     testFunction();
     cout << "Inserted Num:" << mvMyMap["Test"].mnNum << endl;
 return 0;
  }
役に立ちましたか?

解決

myClassは、コピーコンストラクタに加えて、カスタム代入演算子を必要とします。あなたは割り当てを作るときに、あなたが左に元の値をリークします、そして最終的には二重の右側の値を削除します。

他のヒント

あなたのコンストラクタはnumパラメータを無視し、それからmnNumを初期化することはありません。それは次のようになります。

myClass(int num) 
{
    mnNum = new int(num);
    cout << "Constructor Called Num:" << mnNum << endl;
}

また、このようなあなたのコピーコンストラクタを調整する必要があります

myClass(const myClass &copy) 
{
    mnNum = new int(*copy.mnNum);
    cout << "Copy Constructor Called Num:" << mnNum << endl;
}

の編集

デレック・レッドベターは、我々はあまりにも、代入演算子が必要であることを指摘しました。そして、私はデストラクタが仮想作ることをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top