我有以下设置:
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的赋值运算符调用std :: swap时, D 中的QList会被破坏。我完全不清楚我的记忆会发生什么。
这与派生和使用基类指针有关吗?如果我将QMap更改为std :: map,我的程序也会崩溃,但另一个问题也会崩溃。
感谢您的任何建议和提示。
答案 0 :(得分:0)
现在我把一些B和C放到地图上,得到D的参考 通过D的复制构造函数创建QMap的深层副本。
复制了地图,但是你有两个地图指向同一个对象,问题是谁拥有这些对象。
最好不要使用shared_ptr存储原始指针到实例
QMap<QUuid, std::shared_ptr<A>> m_map;
另请注意,您的方法GetMap()
会返回地图的副本,而不是实际的地图,因此当您调用时,您还有一个地图会映射到相同的对象。