gpt4 book ai didi

c++ - 派生类类型与基类的兼容性会导致内存泄漏吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:23:56 26 4
gpt4 key购买 nike

我知道派生类与其基类的指针是类型兼容的。在给定的示例代码中,new bar 对象构造发生在调用 foo::foo() 之后调用 bar::bar()。在各自的构造函数中,我将资源分配给类成员 foo::int *abar::int *b

现在我正在将这样构造的对象初始化为基类类型。使用 obj,我可以调用基类析构函数,但不能调用派生类析构函数。那么,在这种情况下,我该如何释放派生类资源呢?这不是内存泄漏吗?

#include <iostream>
class foo
{
int *a;
public:
foo()
{
a = new int[5];
std::cout << "\n foo constructor" << std::endl;
}
~foo()
{
std::cout << "\n foo destructor" << std::endl;
delete[] a;
}
};

class bar : public foo
{
int *b;
public:
bar()
{
b = new int[5];
std::cout << "\n bar constructor" << std::endl;
}
~bar()
{
std::cout << "\n bar destructor" << std::endl;
delete[] b;
}
};

int main()
{
foo *obj = new bar; // Derived class object is type compatible with base class

delete obj; // Equivalent to obj->~foo();
return 0;
}

谢谢。

最佳答案

这就是“虚析构函数”思想的由来。从技术上讲,如果通过基类类型的指针删除对象,则必须将该基类析构函数标记为virtual,否则结果是undefined。如果确实将析构函数标记为virtual,则其含义与其他虚函数不同。它的意思不是“派生类覆盖此行为”,而是“当通过基类指针删除此对象时,在调用基类构造函数之前调用派生析构函数”。这就是您想要的行为。

作为一般规则,您定义的任何计划子类化的类都应该有一个虚拟析构函数来防止此类问题。

关于c++ - 派生类类型与基类的兼容性会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4612583/

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