gpt4 book ai didi

c++ - 在没有动态内存的世界中我需要虚拟析构函数吗?

转载 作者:行者123 更新时间:2023-11-30 01:35:59 25 4
gpt4 key购买 nike

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

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

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

在我看来,静态分配和自动分配总是会调用正确的析构函数。我想念什么吗?有没有极端情况?静态对象池与 unique_ptr 和自定义删除器结合使用怎么样?

最佳答案

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

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

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

关于c++ - 在没有动态内存的世界中我需要虚拟析构函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52710316/

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