是标头文件中使用“新”定义的成员指针泄漏
Is a member pointer defined with 'new' in the header file a memory leak?
在代码中我使用我在标头文件中找到了一个类声明,该文件包含指针作为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
对象的所有权)。
默认成员启动器没有问题。上面提到的问题是缺乏处理资源获取时必不可少的类别。
相关文章:
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- C++令牌定义成员
- 在没有类定义的标头中定义成员变量
- 如何在类的构造函数中定义成员向量的大小
- 如何在C++中动态定义成员函数
- C++ Boost.Serialization - 用户定义成员的非侵入式序列化
- C++类 - 使用公共变量并在类外定义成员函数
- G++ - 对已定义成员函数的未定义引用
- 在哪里以及如何定义成员变量?在头文件还是实现文件中?
- 是否可以修改STL并自定义成员函数
- 从 boost::mpl:vector 类型列表中定义成员变量
- 在构造对象时定义成员函数
- 为什么定义成员函数指针变量需要类名
- 复制构造函数中的 C++ 用户定义成员
- 如何根据类参数定义成员类运算符
- 使用指向未定义成员函数的指针时的未定义引用
- 如何在运行时定义成员数组大小
- C++-在模板类之外但在头中定义成员函数
- c++在不知道对象类型的情况下定义成员函数指针
- 在特定偏移量中定义成员的结构