我维护一个专为裸机微控制器资源受限环境设计的库:emio。此 C++20 库使用虚拟继承,因此具有虚拟析构函数。
用户在独立的无堆环境中遇到了新问题:
对“operator delete(void*, unsigned int)”的未定义引用#99
问题的根本原因解释如下:为什么虚拟析构函数需要删除运算符。
我的问题是:
我能以某种方式解决用户的问题吗?也许通过为所有类提供破坏性删除器?或者用户是否需要实现自己的全局删除器(例如,调用 std::terminate),如果他意外使用 use new/delete 表达式,该删除器会失败?
此外,为什么链接器不删除这个函数,即使它从未被调用?
旁注:我不想排除使用 new/delete 并在非独立环境中运行的用户。
让用户自己决定如何处理全局可替换
::operator delete
。
如果它们不是独立实现,则默认值可以工作,并且
new
/delete
可以按预期与您的类一起使用。用户仍然可以替换全局可替换 ::operator delete
并让您的类使用预期的分配语义。
如果他们使用独立的实现,那么无论如何他们都必须考虑
::operator delete
,因为它已合并到核心语言中。无论如何,他们需要实现全局可替换重载才能正确使用所有核心语言功能。该选择还会在整个程序范围内产生影响,并且库不应抢占用户的选择。这也不是独立环境的用户需要考虑的唯一重要问题,因此对我来说这似乎并不是一个很大的额外负担。
通过您在 C++26 中链接的论文,编译器也可能有助于定义一个独立的环境,其中
::operator delete
被定义为 noop,以便使用堆分配不起作用,但 virtual
析构函数将继续按预期工作,为用户简化问题。