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处理资源获取时所必需的不变量。
在我使用的代码中,我在 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处理资源获取时所必需的不变量。