我有以下设置:
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 我的程序也会崩溃,但在另一个问题上。
感谢您的任何建议和提示。