0

我有结构aa,我正在尝试运行这样的代码:

aa * b = new aa;
aa * c = new aa;
c=b;
delete (b);
c.useSomeFunction

c我可以使用销毁后指向的对象b吗?

在以下情况下同样的问题:

aa * b = new aa;
aa * c ;
c=b;
delete (b);
c.useSomeFunction
4

2 回答 2

5

在您的示例中,两个指针都指向同一个对象,因此在销毁它之后它们都无效。此外,在您的第一个示例c=b中是自动内存泄漏,因为您无法释放您在aa * c = new aa.


这也不是真正的代码,因为b.usesomefunction不会编译。你的意思是b->use..

于 2012-07-22T15:34:26.613 回答
2

问题的标题具有误导性,因为您没有operator=()在代码中使用 an 。您只分配内置类型的指针。

如前所述:

在您的第一个示例中,指针分配会产生内存泄漏,因为(*c)无法再删除该对象。您也不能调用(*b)( 即使c在删除 object 之后指向的函数(*b)

在您的第二个示例中,您没有遇到内存泄漏。请注意,在生产代码中,您应该使用nullptr. 同样在这里您无法访问(*b)删除对象后的功能。

对函数的调用必须c->useSomeFunction()在语法上正确。

您可能想要(并且由标题建议)是创建一个新对象并将旧对象的内容分配给它。就像是:

struct aa {
  aa():x(0),y(0){}
  aa& operator=(const aa& rhs);
  int foo(){return x-y;}
  int x;
  int y;
};

aa& aa::operator=(const aa& rhs){
  if (this == &rhs) {return *this;}
  x = rhs.x; 
  y = rhs.y;
  return *this;
}

int main(){
  aa *b = new aa();
  aa *c = new aa();
  *c = *b;
  delete(b);
  c->foo();
  delete(c);
  return 0;
}
于 2012-07-22T16:07:01.680 回答