0

我最近问了一个与这个问题有点相关的问题,但它的措辞很糟糕,我不知道自己在做什么。我有时间玩代码,希望这个问题更有意义。尽管如此,还是有一些事情出错。我有一个 B 类。指向该类的指针 (*p)。我只想复制这个指针(比如称为 q)。删除 p 但仍有 qa 有效指针指向 p 所指向的相同信息。然后删除q。当我尝试将它们设置为彼此相等时,我遇到了问题

class B
{
    public:
    B(); ~B();
    B(const B &Overloading);
    B& B::operator=(const B &Overloading);
    vector<*A> stores_a; //class A contains ints, doubles etc. I filled this with
    //pointers to class A
    void Mr_Clean();
};

B::B() {}
~B::B()
 {
    Mr_Clean();
 }
 B::B(const B &Overloading)
 {
     for(size_t i=0; i<stores_a.size(); i++)
     {
         stores_A[i]=new A(*Overloading.stores_a[i]);
     }
  }
B::B& B::operator=(const B &Overloading)
  {
      if(this!=&Overloading)
      {   Mr_Clean(); 
          for(size_t i=0; i<stores_a.size(); i++)
          {
              stores_A[i]=new A(*Overloading.stores_a[i]);
           }
      }
      return *this 
 }
 void B::Mr_Clean()
 {
    for(size_t i=0; i<stores_A.size(); i++)
    {
        delete stores_A[i];
    }
 }
 int main()
 {
       B *p=new B;
       B *q=new B;
       // fill some stuff. this is just random stuff I am making up
       *q=*p; //compiles then Kaboom at this line
        delete p;
        delete q;
      return 0;
  }

我想我在赋值运算符上仍然存在一些概念上的差距。我已经阅读了很多教程,我觉得我正在做他们所说的......

还有另一个问题,比如在这个例子中,我在 B 中也有一个成员 int x。由于我调用了复制构造函数并重载了赋值运算符,我是否必须显式调用 x=Overloading.x?我的意思是从技术上讲,我正在覆盖默认的复制构造函数,不是吗?但是 x 只是一个普通的普通旧 int。

4

2 回答 2

1

我在这里看到两个问题:

  1. 您不调整目标的大小vector。但这目前不会导致任何错误,因为
  2. 您使用目标大小vector来遍历源项目vector。这可能会导致运行时错误。

您可以尝试使用此代码来复制向量:

stores_a.resize(Overloading.stores_a.size());
for(size_t i=0; i<Overloading.stores_a.size(); ++i)
{
    stores_a[i]=new A(*Overloading.stores_a[i]);
}

或者这个(尽管对于一般情况,上面的一个应该更快):

stores_a.clear();
for(size_t i=0; i<Overloading.stores_a.size(); ++i)
{
    stores_a.push_back(new A(*Overloading.stores_a[i]));
}
于 2012-08-27T05:56:33.167 回答
0

你在这里所做的是你在赋值运算符中调用复制构造函数,它为对象分配内存。然后在复制构造函数的主体中,再次为它们分配一些内存。这会导致内存泄漏。在赋值运算符内部,只是向对象中插入一些数据,不要再次分配内存。如果您特别需要关于赋值运算符的帮助,请查看Wikipedia的链接或此处的链接

于 2012-08-27T01:31:57.397 回答