c++ - 为什么没有虚方法的基类不需要虚析构函数?

标签 c++

<分区>

我一直在想,为什么只有虚方法的基类才需要虚析构函数? 看看这段代码(阅读评论):

class Base{
private:
    int x;
public:
    Base():x(0){}
    ~Base(){
        cout<<"Base dtor"<<endl;
    }
}; 

class Derived : public Base{
    int y;
public:
    Derived():y(0){}
    ~Derived(){
        cout<<"Derived dtor"<<endl;
    }
};

int main(){
    Derived *pd = new Derived;
    Base *pb = pd;
    delete pb; // this destroys only the base part, doesn't it?
               // so why doesnt the derived part leak?
    return 0;
}

我用 Valgrind 运行它,看到输出是“Base dtor”,没有发生内存泄漏。那么,如果只调用了基类dtor,为什么派生类部分没有泄露呢?

最佳答案

你问:

why doesnt the derived class part leak?

当你打电话时

delete pb;

运行时知道为对象分配了多少内存并将其释放。 delete 首先调用对象的析构函数,然后释放对象地址处的内存。堆管理器知道有多少空间。

在这种情况下,pb 指向的对象被删除,因此 Base::xDerived::y 的空间都被删除。

如果 Derived::~Derived() 负责释放内存,您将遇到内存泄漏。

关于c++ - 为什么没有虚方法的基类不需要虚析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24053409/

相关文章:

c++ - Win32 - 如何在工具栏中添加 slider ?

android - 超时后CPP调用函数

c++ - 返回对类静态数据成员的引用的正确方法是什么? (我正在使用 Qt,以防它有所作为)

c++ - 在 llvm 上编写一个简单的清理着陆板

c++ - 为什么 C 和 C++ 支持结构内数组的成员赋值,但通常不支持?

引用类型转换中的 C++ 虚函数

c++ - 使用来自文件的输入创建变量

c++ - 大小为 1 的 char 数组和 strcat 的问题

C++11 move(x) 实际上意味着 static_cast<X&&>(x)?

c++ - 搜索并行数组