没有全球运营商的裸机

JD.*_*JD. 5 c++ embedded memory-management bare-metal c++11

考虑安全软件,一般不允许动态分配,不允许例外.仅当class explicity定义operator new和时才允许动态分配delete.new对其他类使用运算符应导致编译失败.

在描述的情况下导致编译失败的最简单方法是删除全局new运算符:

void* operator new(std::size_t) = delete;
Run Code Online (Sandbox Code Playgroud)

一方面,这会导致标准库的副作用.例如包括<array>传播列入<new_allocator><stdexcept>.<new_allocator>使用::new运算符,即使您不想使用异常和内存分配,这也会导致构建失败.据Scoot说,Meyers <array>应该是裸机友好的.

另一方面,这会导致编译器内置运算符错误

src/main.cpp:91:31: error: deleted definition of 'void* operator new(std::size_t)'
 void* operator new(std::size_t) = delete;                               ^
<built-in>: note: previous declaration of 'void* operator new(std::size_t)'
Run Code Online (Sandbox Code Playgroud)

有禁止::new和使用的解决方案<array>吗?

请问有什么解决禁止::new全球所有

Fre*_*pin 4

如果您使用 GCC 和 GNU LD,那么我认为您可以添加--wrap=malloc到链接器标志中。由于全局在内部::new使用malloc(),应用程序中的所有调用都malloc()将替换为__wrap_malloc(). 如果该函数未定义,则链接将失败。

另一个可能更简单的选项是添加ASSERT(DEFINED(malloc) == 0, "Dynamic allocation used!");到链接器脚本中。这将断言malloc()未定义。

这些选项都不能保护您重新定义全局::new以使用某种其他形式的全局分配。::new您可以对链接描述文件中的全局符号执行相同的操作,但它的名称被破坏(在此处_Znwj),所以这会有点奇怪......