通过在C ++中复制包含基类指针的QMap来进行堆栈损坏

时间:2013-02-14 07:43:36

标签: c++ qt pointers stack corruption

我有以下设置:

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,我的程序也会崩溃,但另一个问题也会崩溃。

感谢您的任何建议和提示。

1 个答案:

答案 0 :(得分:0)

  

现在我把一些B和C放到地图上,得到D的参考   通过D的复制构造函数创建QMap的深层副本。

复制了地图,但是你有两个地图指向同一个对象,问题是谁拥有这些对象。

最好不要使用shared_ptr存储原始指针到实例

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

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