线程终止时其本地作用域内的指针指向数据会如何?是否会内存泄漏?
针对你给出的代码场景:
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
相关产品推荐
相关产品推荐

