如果我忘记在 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_data1
、m_data2
和m_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
}
在上面的例子中,ptr
是Parent
类型的,所以delete
只知道Parent
对象的一部分。这意味着只有 m_data1
会被正确清除。没有虚拟析构函数,它不知道对象的 Child
部分,因此 m_data2
将不会被正确清除(它的析构函数永远不会被调用)。
关于c++ - 缺少析构函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21088743/