给定C ++中一个带有私有成员变量name
的简单类和一个基本构造函数:
#include <QString>
class Testclass
{
private:
QString *name;
public:
Testclass(): name(new QString()) {}
};
为什么valgrind的memcheck会抱怨1个块中的8个字节,这在使用这个构造函数时肯定会丢失?
答案 0 :(得分:5)
~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 ++初学者,那么这样做一次就是一个宝贵的教训。