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

assigning one structure/class object to another with operator "="

本文关键字:结构 对象 分配 另一个 一个 运算符      更新时间:2023-10-16

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

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

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

相同的问题在情况下:

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

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


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

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

如前所述:

在第一个示例中,指针分配导致内存泄漏,因为对象(*c)无法再删除。此外,您不能调用(*b)的函数(即使在删除对象(*b)后被c指向。

在第二个例子中,您没有得到内存泄漏。请注意,在生产代码中,应该使用nullptr初始化每个指针。此外,在这里,删除对象后,您无法访问(*b)的函数。

对函数的调用必须是CCD_ 15才能通过语法纠正。

你可能想要的(标题中建议的)是创建一个新对象,并将旧对象的内容分配给它

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;
}