c++ - 在没有动态内存的世界中我需要虚拟析构函数吗?
问题描述
当对象(可能)从基类指针中析构时,需要虚拟析构函数。
考虑一个在嵌入式系统中常见的没有动态内存的程序。在这里,使用new
或delete
触发链接器错误,因为未实现所需的底层分配器。因此,开发人员只使用静态分配的对象(在 bss/data 部分)或自动分配的对象(通常在堆栈上)。
在这样的系统中,是否存在真正需要虚拟析构函数的情况?(假设没有人感到无聊并在某个指针上手动调用析构函数。)
在我看来,静态和自动分配总是调用正确的析构函数。我想念什么吗?是否有任何角落案例?与 unique_ptr 和自定义删除器一起使用的静态对象池怎么样?
解决方案
假设没有人感到无聊并在某个指针上手动调用析构函数。
我认为你已经过快地排除了这种可能性。禁止动态分配的嵌入式/内存受限系统仍然可以创建具有动态存储持续时间的对象。观察:
alignas(T) char memory[sizeof(T)];
T *p = new(memory) T; //Does not call global `new` allocator.
/*do stuff with `p`*/
p->~T();
没有理由禁止这样做。实际上,类型擦除的一些实现依赖于小对象优化。std::any
小对象的实现可以完全使用std::any
对象本身的内存来构造派生类。但它仍然需要调用类型的析构函数,通常是通过基类指针。当然,有些实现any
不使用继承,但我的总体观点是明确禁止手动调用析构函数会很奇怪。
推荐阅读
- r - 将向量元素匹配到R中数据框中的不同级别
- c# - ASP.net core 2. 0 使用事务范围时出错:请求的操作无法完成,因为连接已断开
- python - 将一个列表的第 i 个索引与另一个列表的第 i+1 个索引进行比较
- youtube - 如何按订阅者数量获得最多的 youtube 频道
- java - 有没有办法在TestNG中向@Factory注解发送多个参数
- django - 如何在 django rest 中找到两个用户之间的连接?
- python - 如何在python中输入一对浮点数和整数
- java - 在 Eclipse 格式化程序中应用正则表达式
- javascript - 在 MongoDB 中存储文章的图像
- java - Android Wear:很奇怪的等待周期