是标头文件中使用“新”定义的成员指针泄漏

Is a member pointer defined with 'new' in the header file a memory leak?

本文关键字:定义 成员 泄漏 指针 文件      更新时间:2023-10-16

在代码中我使用我在标头文件中找到了一个类声明,该文件包含指针作为const作为成员的指针,该成员在标题文件中在其中定义了'new'。

匹配的"删除"位于破坏者中(也在标题中定义)。

这个用法还可以吗?它会产生内存泄漏吗?仅当该类的对象被删除(使用新的)或脱离范围(在堆栈上创建时)被摧毁时,才称呼攻击器。但是"新"不在构造函数中,而是班级声明的一部分。这不是之前执行吗?也许每当标头解析时?它可以保证我与删除器中的删除相匹配吗?

class Foo {
public:
  explicit Foo(){}
  ~Foo() {
    delete this->bar;
  }
private:
  const Baz* bar = new Baz();
}; 

它会产生内存泄漏吗?

可能,是的。如果您分配给Foo的实例,则先前指针值拥有的内存泄漏。

这不是之前执行吗?也许每当将标题解析时?

否。成员由构造函数初始化。如果构造函数未明确指定成员启动器(例如,您声明的构造函数就是这种情况),则使用默认成员启动器。

这个用法还可以吗?它可以保证我与删除器中的删除相匹配吗?

否。除泄漏外,如果您制作了对象的副本,将只有两个删除仅匹配一个新的。该程序将具有不确定的行为。

泄漏的最简单修复程序,UB是使用std::unique_ptr而不是裸露的指针。(或者可能是std::shared_ptr,如果您希望类可复制,并希望副本共享同一Baz对象的所有权)。

默认成员启动器没有问题。上面提到的问题是缺乏处理资源获取时必不可少的类别。