gpt4 book ai didi

c++ - 在没有虚析构函数的情况下删除基类指针会不会导致内存泄漏?

转载 作者:行者123 更新时间:2023-11-28 01:51:35 29 4
gpt4 key购买 nike

这是一个解释虚拟析构函数的例子。(参见 http://www.geeksforgeeks.org/g-fact-37/ )我根据那个例子修改了代码,并且有一个关于内存泄漏的问题。

假设基类有一个int num变量,派生类有一个float money变量。

在调用delete base_ptr;时,由于基类的析构函数是虚函数,所以应该先调用~derived(),再调用~Base()

我的问题是“函数 delete 是否足够智能,以便释放为 int num(基类)和 float money(派生类)分配的内存?

我认为 base_ptr 是 Base* 类型的指针,因此它可能只会释放 Base 类所需的内存量。但是,即使 base_ptr 是基类的指向类型,似乎 int 和 float 都会被释放。如果是这样的话,我们把~Base()做成非虚析构函数会不会导致内存泄露呢?使用 ~Base() 的非虚拟析构函数,我们会错过 ~Derived() 的调用。因为在基类和派生类“内部”都没有动态分配任何内容,所以 ~Derived() 似乎根本没有释放任何内存,而 delete 函数会释放 int numfloat money 的内存。

#include <iostream>
using namespace std;

class Base {
public:
int num;

Base(int n):num(n){
cout<<"Base::Constructor\n";
}
virtual ~Base(){
cout<<"Base::Destructor\n";
}
};

class Derived : public Base {
private:
float money;
public:
Derived(int n, float m):Base(n),money(m){
cout<<"Derived::Constructor\n";
}
~Derived(){
cout<<"Derived::destructor\n";
}
};



int main() {
Base *base_ptr = new Derived(1,200.0);
delete base_ptr;
return 0;
}

最佳答案

您所描述的是未定义行为,这意味着任何讨厌的东西都可能出错,而不仅仅是内存泄漏。

但实际上,如果继承不是虚拟的,派生类没有其他基类,并且派生类没有具有非平凡析构函数的成员,你可能会得到 Base::~Base () 调用析构函数,然后调用指针上的 operator deleteoperator delete(void*) 函数只接受一个指针并释放它指向的所有内存,因此那里没有“内存泄漏”。

关于c++ - 在没有虚析构函数的情况下删除基类指针会不会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42845059/

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