我认为发生的是ASetVar返回的rvalue 是一个相同的副本Class并且共享相同的指针Var.但是当右值调用其解构它删除Class的Val.
class A
{
private:
int* Var;
public:
A SetVar(int);
~A()
{
delete Var;
}
};
A A::SetVar(int NewVar)
{
Var=new int;
*Var=NewVar;
//POINT A
return *this;
}
int main()
{
A Class;
Class.SetVar(8);
//POINT B
}
Run Code Online (Sandbox Code Playgroud)
在POINT A *Val等于8,但POINT B *Val平等-17891602.由于尝试删除Val两次,我也得到_BLOCK_TYPE_IS_VALID(pHead-> nHeadUse).
删除解构器可以解决问题,但会造成内存泄漏.
你违反了三法则
因此,当您这样做时,您可以复制该对象
return *this
Run Code Online (Sandbox Code Playgroud)
它也会被破坏,并delete在同一个指针上被调用两次.无论如何你真的不应该这样做.你应该返回一个引用,但为什么setter函数会返回对它被调用的对象的引用?是链接函数调用吗?
此外,Var每次重新分配时都会泄漏.