You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用__builtin_operator_new触发递归导致STATUS_STACK_OVERFLOW的原因排查

内存管理中__builtin_operator_new触发栈溢出的问题成因

你在学习内存管理时,使用__builtin_operator_new遭遇递归调用问题,触发STATUS_STACK_OVERFLOW错误:

Exception 0xc00000fd encountered at address 0x7ff698ff100e

根据Clang官方文档,该内置操作符行为应与标准operator 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

问题成因

核心原因是无限递归调用,具体逻辑链如下:

  • 你通过-nostdlib编译选项禁用了标准库,导致Clang的__builtin_operator_new失去了标准库提供的底层内存分配实现;
  • 此时调用__builtin_operator_new时,它会默认回退调用用户自定义的operator new;
  • 而你自定义的operator new又直接调用__builtin_operator_new,形成无限递归循环,持续消耗栈空间,最终触发STATUS_STACK_OVERFLOW错误。

本质上,__builtin_operator_new并非直接对接系统底层内存分配接口(比如malloc),在无标准库的环境下,它需要用户提供真正的内存分配逻辑,而非仅做一层包装调用自身。

内容的提问来源于stack exchange,提问作者Loferil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:32:21