我有结构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
答案 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;
}