使用运算符“=”将一个结构/类对象分配给另一个

时间:2012-07-22 15:32:56

标签: c++ struct structure assign

我有结构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

2 个答案:

答案 0 :(得分:5)

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


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

答案 1 :(得分:2)

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

如前所述:

在第一个示例中,指针分配会产生内存泄漏,因为无法再删除对象(*c)。此外,您无法调用(*b)的函数(即使在删除对象c后由(*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;
}