次の設定があります。
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 */
}
ここで、いくつかのBとCをマップに入れ、 D からの参照を取得します。これにより、 Dのコピー コンストラクターを介して QMap のディープ コピーが作成されます。QMap のサイズを取得しようとすると、機能していますが、リストが破損しています。デバッガーの助けを借りて、QMapの代入演算子が std::swap を呼び出すと、Dの QList が破損することがわかりました。私の記憶で何が起こっているのかは、私には完全に不明です。
これは、派生と基本クラスのポインターの使用に関係がありますか? QMap を std::map に変更すると、プログラムもクラッシュしますが、別の時点で別の問題が発生します。
アドバイスやヒントをありがとう。