实验
定义一个基类和一个派生类
class Base
{
public:
virtual ~Base() = default;
};
class Derive :
public Base
{
public:
std::shared_ptr<int> sp{
new int{0},
[](int *p)
{
delete p;
std::cout << "删除器" << endl;
},
};
};
main 函数执行如下代码
Base *p = new Derive{};
delete p;
输出结果如下

如果删除基类的虚析构,如下
class Base
{
public:
// virtual ~Base() = default;
};
class Derive :
public Base
{
public:
std::shared_ptr<int> sp{
new int{0},
[](int *p)
{
delete p;
std::cout << "删除器" << endl;
},
};
};
再次执行,输出结果如下

没有任何输出。这说明智能指针的删除器没有执行,进而说明智能指针的析构函数没有被调用。所以,基类一定要有虚析构。
结论
C++ 一个类,如果不是 final ,就一定要定义虚析构,否则被继承后就有发生内存泄漏的风险。不定义虚析构的类一定要标记为 final,明确阻止继承。










![NSSCTF联系记录:[SWPUCTF 2021 新生赛]crypto7](https://i-blog.csdnimg.cn/direct/809514a5596f487aabf571fa9ce0b1db.png)

![[C语言]-基础知识点梳理-文件管理](https://i-blog.csdnimg.cn/direct/fc4697f8861348ac8820fbf6d9cb10b0.png)




