关于c ++:在没有动态内存的世界中,我是否需要虚拟析构函数?

Do I need virtual destructors in a world without dynamic memory?

当对象(可能)被基类指针破坏时,需要使用虚拟析构函数。

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

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

在我看来,静态和自动分配总是调用正确的析构函数。我有错过什么吗?有角箱吗?静态对象池与唯一的指针和自定义的删除器结合在一起怎么样?


Let's say nobody is bored and calls a destructor manually on some pointer.

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

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