在独立环境中处理虚拟析构函数中所需的删除运算符

问题描述 投票:0回答:1

我维护一个专为裸机微控制器资源受限环境设计的库:emio。此 C++20 库使用虚拟继承,因此具有虚拟析构函数。

用户在独立的无堆环境中遇到了新问题:

对“operator delete(void*, unsigned int)”的未定义引用#99

问题的根本原因解释如下:为什么虚拟析构函数需要删除运算符

我的问题是:

我能以某种方式解决用户的问题吗?也许通过为所有类提供破坏性删除器?或者用户是否需要实现自己的全局删除器(例如,调用 std::terminate),如果他意外使用 use new/delete 表达式,该删除器会失败?

此外,为什么链接器不删除这个函数,即使它从未被调用?

旁注:我不想排除使用 new/delete 并在非独立环境中运行的用户。

c++ delete-operator freestanding
1个回答
0
投票

让用户自己决定如何处理全局可替换

::operator delete

如果它们不是独立实现,则默认值可以工作,并且

new
/
delete
可以按预期与您的类一起使用。用户仍然可以替换全局可替换
::operator delete
并让您的类使用预期的分配语义。

如果他们使用独立的实现,那么无论如何他们都必须考虑

::operator delete
,因为它已合并到核心语言中。无论如何,他们需要实现全局可替换重载才能正确使用所有核心语言功能。该选择还会在整个程序范围内产生影响,并且库不应抢占用户的选择。这也不是独立环境的用户需要考虑的唯一重要问题,因此对我来说这似乎并不是一个很大的额外负担。

通过您在 C++26 中链接的论文,编译器也可能有助于定义一个独立的环境,其中

::operator delete
被定义为 noop,以便使用堆分配不起作用,但
virtual
析构函数将继续按预期工作,为用户简化问题。

© www.soinside.com 2019 - 2024. All rights reserved.