gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:04:09 26 4
gpt4 key购买 nike

如果我忘记在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com