考虑安全软件,其中一般不允许动态分配并且不允许例外。仅当类显式定义运算符时才允许动态分配new
and delete
。使用运算符new
对于其他类应该会导致编译失败。
在上述情况下导致编译失败的最简单方法是删除全局 new 运算符:
void* operator new(std::size_t) = delete;
一方面,这会对标准库造成副作用。例如包括<array>
将包容性传播到<new_allocator>
by <stdexcept>
. <new_allocator>
uses ::new
运算符,即使您不想使用异常和内存分配,这也会导致构建失败。根据斯科特·迈耶斯的说法<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)'
有什么办法可以禁止::new
并使用<array>
?
有什么办法可以禁止::new
全球at all?
如果你使用 GCC 和 GNU LD,那么我想你可以添加--wrap=malloc
到你的链接器标志。作为全球::new
uses malloc()
在内部,所有调用malloc()
您的应用程序中将替换为__wrap_malloc()
。如果该函数未定义,则链接将失败。
另一个可能更简单的选择是添加ASSERT(DEFINED(malloc) == 0, "Dynamic allocation used!");
到您的链接器脚本。这将断言malloc()
没有定义。
这些选项都不能保护您重新定义全局::new
使用某种其他形式的全局分配。您可以对全局符号执行相同的操作::new
在链接器脚本中,但它的名称被破坏了(在这里_Znwj
),所以这会有点奇怪......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)