__builtin_operator_new 调用递归

问题描述 投票:0回答:1

我目前正在研究内存处理并遇到问题。当我尝试使用

__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

c++ memory new-operator
1个回答
1
投票

首先,您会注意到

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

我可能会补充一点,

nostdlib
选项可能意味着标准的
operator new
甚至不可用,并且唯一存在的就是您定义的那个。

© www.soinside.com 2019 - 2024. All rights reserved.