为什么在构造函数的初始化列表中使用new运算符进行memleak?

Tor*_*örn 0 c++ constructor valgrind memory-leaks new-operator

给定一个C++中带有私有成员变量name和基本构造函数的简单类:

#include <QString>

class Testclass
{
  private:
    QString *name;

  public:
    Testclass(): name(new QString()) {}
};
Run Code Online (Sandbox Code Playgroud)

为什么valgrind的memcheck会抱怨1个块中的8个字节,这在使用这个构造函数时肯定会丢失?

01d*_*d55 5

~Testclass(){delete name;}
Run Code Online (Sandbox Code Playgroud)

会堵塞你的泄漏.C++没有(也不应该)为你做这件事.

ETA:ildjarn正确指出您还应该有一个复制构造函数和赋值运算符.

TestClass(const TestClass &cp): name(new QString(*(cp.name)) ) {}
const TestClass& operator=(const Testclass&rhs)
{
  (*name)=(*hrs.name);
  return *this;
}
Run Code Online (Sandbox Code Playgroud)

否则,默认的复制构造函数或赋值运算符将导致相同的内存被删除两次.大多数需要析构函数的类应该替换或禁用默认的复制构造函数和赋值运算符.这被称为"三个规则".

您可能想要考虑简单地按值保存QString,因为它本身可能是一个轻量级容器类,如std :: string或std :: vector.但如果你是一名C++初学者,那么这样做一次就是一个宝贵的教训.

  • 当然,除了析构函数之外,他还需要一个copy-constructor和copy-assignment操作符.[三条规则](http://en.wikipedia.org/wiki/Rule_of_three_(C% 2B% 2B_programming)) (6认同)