header文件中用'new'定义的成员指针是否内存泄漏?

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

在我使用的代码中,我在 header 文件中找到了一个 class 声明,其中包含一个指向 const 的指针作为成员,该成员在 [=] 中用 'new' 定义25=] 文件.

匹配的 'delete' 在析构函数中(也在 header 中定义)。

这个用法可以吗?它会造成内存泄漏吗? 仅当 class 的 object 被销毁时才会调用析构函数,无论是通过删除(当使用 new 创建时)还是超出范围(当在堆栈上创建时)。 但是 'new' 不在构造函数中,而是 class 声明的一部分。这不是提前执行了吗?也许甚至在解析 header 时?它保证与析构函数中的删除相匹配吗?

class Foo {
public:
  explicit Foo(){}
  ~Foo() {
    delete this->bar;
  }

private:
  const Baz* bar = new Baz();
}; 

Does it create a memory leak?

可能是的。如果你赋值给Foo的一个实例,前一个指针值所拥有的内存就会泄漏。

Isn't this executed earlier? Maybe even whenever the header is parsed?

没有。成员由构造函数初始化。如果构造函数未明确指定成员初始化程序(例如您声明的构造函数的情况),则使用成员声明中的默认成员初始化程序。

Is this usage ok? Is it guaranteed to me matched by the delete in the destructor?

没有。除了泄漏之外,如果您复制该对象,将有两个删除只匹配一个新的。该程序会有未定义的行为。

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

虽然默认成员初始化程序没有问题。上面提到的问题是缺少class处理资源获取时所必需的不变量。