0

最近、これに関連する質問をしましたが、言葉遣いがひどく、自分が何をしているのかわかりませんでした。コードをいじる時間があり、この質問がより理にかなっていることを願っています。それにもかかわらず、まだ何かが間違っています。クラス B があります。そのクラスへのポインター (*p)。このポインターのコピーを作成したいだけです(たとえば、qと呼ばれます)。p を削除しますが、p も指していたのと同じ情報への有効なポインター ポインターをまだ持っています。次に、q を削除します。それらを互いに等しく設定しようとすると、問題が発生します

class B
{
    public:
    B(); ~B();
    B(const B &Overloading);
    B& B::operator=(const B &Overloading);
    vector<*A> stores_a; //class A contains ints, doubles etc. I filled this with
    //pointers to class A
    void Mr_Clean();
};

B::B() {}
~B::B()
 {
    Mr_Clean();
 }
 B::B(const B &Overloading)
 {
     for(size_t i=0; i<stores_a.size(); i++)
     {
         stores_A[i]=new A(*Overloading.stores_a[i]);
     }
  }
B::B& B::operator=(const B &Overloading)
  {
      if(this!=&Overloading)
      {   Mr_Clean(); 
          for(size_t i=0; i<stores_a.size(); i++)
          {
              stores_A[i]=new A(*Overloading.stores_a[i]);
           }
      }
      return *this 
 }
 void B::Mr_Clean()
 {
    for(size_t i=0; i<stores_A.size(); i++)
    {
        delete stores_A[i];
    }
 }
 int main()
 {
       B *p=new B;
       B *q=new B;
       // fill some stuff. this is just random stuff I am making up
       *q=*p; //compiles then Kaboom at this line
        delete p;
        delete q;
      return 0;
  }

代入演算子にはまだ概念的なギャップがあると思います。私は多くのチュートリアルを読みましたが、彼らが言うことをやっているような気がします...

また別の質問として、この例では、B にメンバー int x もあったとします。コピー コンストラクターを呼び出し、代入演算子をオーバーロードしたので、明示的に x=Overloading.x を呼び出す必要がありますか? 技術的には、デフォルトのコピーコンストラクターをオーバーライドしているということですか? ただし、x は単なる普通の int です。

4

2 に答える 2

1

ここには 2 つの問題があります。

  1. destination のサイズを変更しませんvectorしかし、これは現時点ではエラーを引き起こしません。
  2. size の destinationvectorを使用して、 source のアイテムをループしますvector。これにより、実行時エラーが発生する可能性があります。

このコードを使用してベクトルをコピーできます。

stores_a.resize(Overloading.stores_a.size());
for(size_t i=0; i<Overloading.stores_a.size(); ++i)
{
    stores_a[i]=new A(*Overloading.stores_a[i]);
}

またはこれ(ただし、一般的なケースでは上記の方が高速です):

stores_a.clear();
for(size_t i=0; i<Overloading.stores_a.size(); ++i)
{
    stores_a.push_back(new A(*Overloading.stores_a[i]));
}
于 2012-08-27T05:56:33.167 に答える
0

ここで行っているのは、オブジェクトにメモリを割り当てる代入演算子内でコピー コンストラクターを呼び出していることです。次に、コピー コンストラクターの本体内で、再びメモリを割り当てます。これにより、メモリリークが発生しています。代入演算子内では、オブジェクトにデータを挿入するだけで、メモリを再度割り当てません。代入演算子について特にヘルプが必要な場合は、ウィキペディアのリンクまたはこちらのリンクを確認してください

于 2012-08-27T01:31:57.397 に答える