我认为发生的是SetVar返回的右值A
与Class
的副本相同,并且共享相同的指针Var
。但是当rvalue调用它的解构函数时,它会删除Class
的{{1}}。
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
}
POINT A
等于8,但*Val
POINT B
等于*Val
。由于尝试删除-17891602
两次,我也得到_BLOCK_TYPE_IS_VALID(pHead-> nHeadUse)。
删除解构器可以解决问题,但会造成内存泄漏。
答案 0 :(得分:6)
因此,当您执行
时,您可以复制该对象return *this
也会被破坏,并且delete
在同一个指针上被调用两次。无论如何你真的不应该这样做。你应该返回一个引用,但为什么setter函数会返回对它被调用的对象的引用?是链接函数调用吗?
此外,每次重新分配时,您都会泄漏Var
。
答案 1 :(得分:1)
这里有一些问题。
首先,问题的最直接原因是当SetVar()返回时,this
对象的副本。 (您可能希望返回对A的引用。)由于没有为A类定义复制构造函数,因此会隐式复制所有字段的值。这意味着副本将具有指向您在SetVar中分配的相同Var int的指针。换句话说,您将有两个指向同一内存的指针,一个在原始A变量(您称为“Class”的变量)中,另一个在SetVar()返回的副本中。当第二个被销毁时,它的析构函数将删除已经删除的指针的内存。