c++ __builtin_operator_new递归调用

qcuzuvrc  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(156)

我目前正在学习内存处理,遇到了一个问题。当我尝试使用__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

oknwwptz

oknwwptz1#

首先,您会注意到__builtin_operator_new是一个clang扩展,并且不是C++标准的一部分。clang文档说:“对__builtin_operator_new(args)的调用与对::operator new(args)的调用完全相同,除了[...],并且该调用需要解析为可替换的全局分配函数。”我将此解释为__builtin_operator_new不需要解析为可替换的全局分配函数,但它可以-在您的情况下,它看起来像是解析为您定义的全局分配函数。它何时解析为全局分配函数,何时不解析,可能取决于各种优化,以及全局分配函数的声明是否可见。
我可能会补充说,nostdlib选项可能意味着标准的operator new甚至不可用,并且唯一存在的是您定义的那个。

相关问题