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

线程终止时其本地作用域内的指针指向数据会如何?是否会内存泄漏?

针对你给出的代码场景:

void MyThread()
{
    auto* ptr = new int[10];

    while (true)
    {
        // stuff
    }

    // thread is interrupted before this delete
    delete[] ptr;
}

结论

这种场景下一定会产生内存泄漏,动态分配的内存不会被自动回收,除非整个进程终止运行。

具体原因

  • C++ 中通过new关键字申请的内存属于进程级的堆空间,不属于线程私有资源。线程被强制中断终止时,操作系统只会回收该线程独占的资源(比如线程栈、线程上下文、线程本地存储TLS内容),不会主动扫描并回收进程堆里分配的内存。
  • 强制中断线程的场景下(比如调用pthread_cancel、Windows平台的TerminateThread接口),线程不会执行后续的栈展开逻辑,不仅你写在后面的delete[]语句永远不会执行,连作用域内局部对象的析构函数也不会被调用。如果你没有其他地方记录这块内存的地址去执行释放,这块内存就会一直被系统标记为已占用,直到整个进程退出后操作系统才会统一回收进程的所有内存资源。

补充说明

如果线程是走正常退出逻辑(比如抛出异常退出、std::jthread响应停止请求后退出),你可以用RAII工具(比如std::unique_ptr<int[]>)包裹动态内存,栈展开时会自动调用析构函数释放内存,避免泄漏;但如果是强制中断线程的场景,RAII也无法生效,因为析构函数没有执行机会。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:27:04