首页 > 解决方案 > 在没有动态内存的世界中我需要虚拟析构函数吗?

问题描述

当对象(可能)从基类指针中析构时,需要虚拟析构函数。

考虑一个在嵌入式系统中常见的没有动态内存的程序。在这里,使用newdelete触发链接器错误,因为未实现所需的底层分配器。因此,开发人员只使用静态分配的对象(在 bss/data 部分)或自动分配的对象(通常在堆栈上)。

在这样的系统中,是否存在真正需要虚拟析构函数的情况?(假设没有人感到无聊并在某个指针上手动调用析构函数。)

在我看来,静态和自动分配总是调用正确的析构函数。我想念什么吗?是否有任何角落案例?与 unique_ptr 和自定义删除器一起使用的静态对象池怎么样?

标签: c++embeddedc++14virtual-destructorstatic-memory-allocation

解决方案


假设没有人感到无聊并在某个指针上手动调用析构函数。

我认为你已经过快地排除了这种可能性。禁止动态分配的嵌入式/内存受限系统仍然可以创建具有动态存储持续时间的对象。观察:

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使用继承,但我的总体观点是明确禁止手动调用析构函数会很奇怪。


推荐阅读