我目前正在研究内存处理并遇到问题。当我尝试使用
__builtin_operator_new
时,我遇到了导致 STATUS_STACK_OVERFLOW 错误的递归:
Exception 0xc00000fd encountered at address 0x7ff698ff100e
什么可能导致此问题?
从 clang 文档 中可以明显看出,这些运算符的操作方式应与标准运算符 new 和 delete 类似。下面是演示该问题的示例代码:
class tester {
public:
explicit tester( int value ) : m_value( value ) { }
[[nodiscard]] auto value( ) const -> int {
return m_value;
}
private:
int m_value { };
};
#include <memory>
[[nodiscard]] auto operator new ( const std::size_t __sz ) -> void * {
return ::__builtin_operator_new( __sz );
}
auto operator delete ( void *__ptr ) noexcept -> void {
return ::__builtin_operator_delete( __ptr );
}
extern "C" {
auto start( ) -> int {
const auto test = std::make_unique< tester >( 99 );
const auto value = test->value( );
( void ) value;
return 0;
}
}
还有我使用的标志:
-fno-exceptions;-nostdlib;-Wl,-e,start
首先,您会注意到
__builtin_operator_new
是 clang 扩展,而不是 C++ 标准的一部分。 clang 文档说:“对 __builtin_operator_new(args)
的调用与对 ::operator new(args)
的调用完全相同,除了 [...] 并且该调用需要解析为可替换的全局分配函数。”我将其解释为意味着不需要 __builtin_operator_new
来解析为可替换的全局分配函数,但它可能 - 在您的情况下,它看起来像是解析为您定义的全局分配函数。当它解析为全局分配函数时,当它不解析时,可能取决于各种优化,以及全局分配函数的声明是否可见。
我可能会补充一点,
nostdlib
选项可能意味着标准的operator new
甚至不可用,并且唯一存在的就是您定义的那个。