返回*这个; 删除指针

Lau*_*uer 0 c++ class rvalue

我认为发生的是ASetVar返回的rvalue 是一个相同的副本Class并且共享相同的指针Var.但是当右值调用其解构它删除ClassVal.

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).

删除解构器可以解决问题,但会造成内存泄漏.

Ed *_* S. 6

你违反了三法则

因此,当您这样做时,您可以复制该对象

return *this
Run Code Online (Sandbox Code Playgroud)

它也会被破坏,并delete在同一个指针上被调用两次.无论如何你真的不应该这样做.你应该返回一个引用,但为什么setter函数会返回对它被调用的对象的引用?是链接函数调用吗?

此外,Var每次重新分配时都会泄漏.