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

Why memleak with new operator in constructor's initialization list?

本文关键字:运算符 new 构造函数 初始化 列表 为什么      更新时间:2023-10-16

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

#include <QString>
class Testclass
{
  private:
    QString *name;
  public:
    Testclass(): name(new QString()) {}
};

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

~Testclass(){delete name;}

将堵塞你的泄漏。c++不会(也不应该)为你做这些。

ETA: ildjarn正确地指出,还应该有复制构造函数和赋值操作符。

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

否则,默认复制构造函数或赋值操作符将导致同一内存被删除两次。大多数需要析构函数的类应该替换或禁用默认复制构造函数和赋值操作符。这就是所谓的"三法则"。

您可能想考虑简单地按值保存QString,因为它本身可能是一个轻量级容器类,就像std::string或std::vector一样。但是如果你是一个c++的初学者,这样做一次是很有价值的一课。