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

0

现在我将一些 B 和 C 放入映射中,从 D 中获取引用,该引用通过 D 的复制构造函数创建 QMap 的深层副本。

地图被复制,但是您有两个指向相同对象的地图,那么问题是谁拥有这些对象。

最好不要存储原始指针,而是使用 shared_ptr 到您的实例

QMap<QUuid, std::shared_ptr<A>> m_map;

另请注意,您的方法GetMap()返回地图的副本,而不是实际的地图,因此当您调用时,您还有一个映射到相同对象的地图。

于 2013-02-14T08:51:10.040 回答