c++ - 缺少析构函数声明

标签 c++ memory destructor

如果我忘记在 C++ 类中声明析构函数,谁能告诉我对象的内存会发生什么情况?我的意思是,它是被释放还是导致内存泄漏? 示例或演示将不胜感激。

提前致谢。

最佳答案

为任何重要的类定义析构函数通常被认为是好的做法(参见 Rule of Three )。然而,在现代 C++(即 C++11 之后)中,它不像以前那样必要了。

如果您的类不是从其他任何东西继承的,那么编译器提供的默认析构函数将正确销毁任何直接成员(例如变量和对象)。同样,如果您的对象拥有任何包裹在智能指针中的堆分配对象,它们也将被安全销毁。

如果您的对象通过原始指针拥有任何堆分配的数据,就会出现问题。隐式析构函数无法知道如何处理它们,因此您需要自定义析构函数来清除它们。例如:

class MyClass
{
    int m_data1;
    std::string m_data2;
    std::shared_ptr<Widget> m_data3;
    Widget *m_data4;
};

在上面的示例中,成员m_data1m_data2m_data3 都将在没有自定义析构函数的情况下被正确清除。但是,m_data4 指向的对象将不会 自动清除。如果它是由 MyClass 分配的,那么它通常会导致内存泄漏(除非它被其他东西释放)。

综上所述,继承以一种重要的方式改变了一切。如果你的类被其他任何东西继承,那么你应该总是给它一个虚拟析构函数。如果通过指向继承类的指针删除对象,并且该类没有有虚拟析构函数,则永远不会调用子类的析构函数,可能会导致内存泄漏。 p>

例如:

class Parent
{
public:
    Widget m_data1;
}

class Child : public Parent
{
public:
    Widget m_data2;
}

int main()
{
    Parent *ptr = new Child;
    delete ptr; // <-- clears-up Parent but not Child
}

在上面的例子中,ptrParent类型的,所以delete只知道Parent对象的一部分。这意味着只有 m_data1 会被正确清除。没有虚拟析构函数,它不知道对象的 Child 部分,因此 m_data2 将不会被正确清除(它的析构函数永远不会被调用)。

关于c++ - 缺少析构函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21088743/

相关文章:

c++ - 我的程序需要读取一个文本文件,文本文件中的数据需要用逗号分隔(C++)

python - numpy ndarray 使用了多少内存?

c++ - 为什么析构函数调用比构造函数调用多

c++ - 在构造函数之后立即调用析构函数

c++ - 关于使用新运算符的 C++ 范围

C++单独的文件?

c++ - 运行时检查失败 #2 : Stack around the variable 'expression' was corrupted

c++ - 使用VirtualQuery找出哪个 "file"使用内存中的某个页面

Python:字符串计数内存错误

c++ - 在 Visual Studio 中将字符串转换为日期对象