为什么要在构造函数的初始化列表中使用 new 运算符进行忆阻?
Why memleak with new operator in constructor's initialization list?
给定一个带有私有成员变量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++的初学者,这样做一次是很有价值的一课。
相关文章:
- 重载运算符new[]的行为取决于析构函数
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- 运算符 new 的执行顺序和构造函数的参数
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 重载运算符 new 和运算符 delete 带有三个参数
- 为什么运算符"new"需要指针才能工作?
- 重载运算符 new(),为什么构造函数被调用两次?
- 为什么运算符 new[] 为数组的大小分配内存?
- 在混合 c 和 c++ 代码中使用运算符 new
- 重载运算符 new/new[] 删除/删除[] 全局C++
- 为什么允许重新定义全局运算符 new(size_t)?
- 无法访问使用运算符 new() 分配的内存
- 显式调用"运算符 new"后无法访问对象的函数
- c++ 运算符 new[]/delete [] 是否调用运算符 new/delete?
- 崩溃时间(运算符 new(无符号 int)+22)
- 继承类上的运算符new和delete.操作员删除未执行
- 运算符new[]不接收额外的字节
- 如果我在C++中分配一个带有运算符 new[] 的对象数组,但单独释放它们是否仍然构成内存泄漏