我目前正在学习内存处理,遇到了一个问题。当我尝试使用__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;
}
}
godbolt
还有我用途:-fno-exceptions;-nostdlib;-Wl,-e,start
1条答案
按热度按时间oknwwptz1#
首先,您会注意到
__builtin_operator_new
是一个clang扩展,并且不是C++标准的一部分。clang文档说:“对__builtin_operator_new(args)
的调用与对::operator new(args)
的调用完全相同,除了[...],并且该调用需要解析为可替换的全局分配函数。”我将此解释为__builtin_operator_new
不需要解析为可替换的全局分配函数,但它可以-在您的情况下,它看起来像是解析为您定义的全局分配函数。它何时解析为全局分配函数,何时不解析,可能取决于各种优化,以及全局分配函数的声明是否可见。我可能会补充说,
nostdlib
选项可能意味着标准的operator new
甚至不可用,并且唯一存在的是您定义的那个。