返回*这个;删除指针

时间:2012-06-30 02:18:51

标签: c++ class rvalue

我认为发生的是SetVar返回的右值AClass的副本相同,并且共享相同的指针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)。

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

2 个答案:

答案 0 :(得分:6)

您违反了The Rule of Three

因此,当您执行

时,您可以复制该对象
return *this

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

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

答案 1 :(得分:1)

这里有一些问题。

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