我有结构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
在您的示例中,两个指针都指向同一个对象,因此在销毁它之后它们都无效。此外,在您的第一个示例c=b
中是自动内存泄漏,因为您无法释放您在aa * c = new aa
.
这也不是真正的代码,因为b.usesomefunction
不会编译。你的意思是b->use..
。
问题的标题具有误导性,因为您没有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;
}