1

次の設定があります。

class A {
  public:
  A();
  virtual ~A();
  A(const A&other) {*this = other;}
  A& operator=(const A&) {/*assigne reference members, create new of pointer members*/}

  /* some other stuff */
}

class B : public A {
  public:
  B();
  virtual ~B();
  B(const B&other) {*this = other;}
  B& operator=(const B&rhs) { A::operator=(rhs); /*assigne reference members, create new of pointer members*/}

  /* some other stuff */
}

class C : public A {
  public:
  C();
  virtual ~C();
  C(const C&other) {*this = other;}
  C& operator=(const C&) { A::operator=(rhs); /*assigne reference members, create new of pointer members*/}

  /* some other stuff */
}


class D {
  public:
  D();
  virtual ~D();
  D(const D&other) {*this = other;}
  D& operator=(const D&rhs) {
    /* iterate through map and create new instances of B or C */
    m_list = rhs.m_list;
  }

  QMap<QUuid, A*> GetMap() {return m_map;}
  QList<QUuid> GetList {return m_list;}

  private:
  QMap<QUuid, A*> m_map;
  QList<QUuid> m_list;

  /* some other stuff */
}

ここで、いくつかのBCをマップに入れ、 D からの参照を取得します。これにより、 Dのコピー コンストラクターを介して QMap のディープ コピーが作成されます。QMap のサイズを取得しようとすると、機能していますが、リストが破損しています。デバッガーの助けを借りて、QMapの代入演算子が std::swap を呼び出すと、Dの QList が破損することがわかりました。私の記憶で何が起こっているのかは、私には完全に不明です。

これは、派生と基本クラスのポインターの使用に関係がありますか? QMap を std::map に変更すると、プログラムもクラッシュしますが、別の時点で別の問題が発生します。

アドバイスやヒントをありがとう。

4

1 に答える 1