0

我认为发生的是ASetVar 返回的右值是相同的副本Class并共享相同的指针Var。但是当右值调用它的解构函数时,它会删除Class's 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
}

等于8 POINT A *Val,但POINT B *Val等于-17891602。由于尝试删除Val两次,我还得到 _BLOCK_TYPE_IS_VALID(pHead->nHeadUse) 。

删除解构函数可以解决问题,但会造成内存泄漏。

4

2 回答 2

6

你违反了三法则

所以,当你做的时候,你制作了一个对象的副本

return *this

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

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

于 2012-06-30T02:26:32.723 回答
1

这里有几个问题。

首先,问题的最直接原因是SetVar() 返回时创建了对象的副本。this(您可能希望返回对 A 的引用。)由于没有为类 A 定义复制构造函数,所有字段的值都被隐式复制。这意味着该副本将具有指向您在 SetVar 中分配的同一个 Var int 的指针。换句话说,您将有两个指向同一内存的指针,一个位于原始 A 变量(您称为“类”的那个)中,另一个位于由 SetVar() 返回的副本中。当其中第二个被销毁时,其析构函数将删除已删除指针处的内存。

于 2012-06-30T02:26:44.223 回答