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

使用new分配的内存会随线程结束自动释放吗?需手动delete吗?

线程中new分配内存的释放问题

核心结论

用new分配的堆内存不会因为线程调用join而自动释放,必须手动调用delete完成内存回收,否则会造成内存泄漏。

原因解释

C++中堆内存的管理是手动负责的——不管内存是在主线程还是子线程中通过new(或new[])分配,都需要开发者显式调用delete(或delete[])来释放。线程的join操作只是让主线程等待子线程执行完毕,它不会对子线程内分配的堆内存做任何自动回收处理。

针对你的示例代码分析

在th1、th2、th3、th4的线程函数中,你通过int* a = new int;分配了堆内存,但没有对应的delete a;操作:

  • 当主线程jointh1、th2、th3后,这三个线程已经执行完毕,但它们分配的堆内存会一直被占用,直到整个程序退出(此时操作系统会统一回收进程内存,但这属于被动回收,不是正确的内存管理方式)。
  • 这些未释放的内存不会自动供th4使用——堆内存的分配与释放是独立的,th4无法直接获取其他线程未释放的内存,若需要内存需自行分配或通过共享机制传递。
  • 这种写法明确会造成内存泄漏,每个线程都会泄漏一个int大小的堆内存。

修正方案

  1. 手动调用delete:在线程函数结束前显式释放内存
#include <iostream>
#include <thread>
using namespace std; 
class thread_obj {
public:
    void operator()(int x)
    {
        int* a = new int;
        *a = x;
        cout << *a << endl;
        delete a; // 手动释放堆内存,避免泄漏
    }
};
int main() {
    thread th1(thread_obj(), 1);
    thread th2(thread_obj(), 1);
    thread th3(thread_obj(), 1);
    thread th4(thread_obj(), 1);

    th1.join();
    th2.join();
    th3.join();
    
    while (true) {
        // th4 is still running
    }

    th4.join();
    return 0;
}
  1. 使用智能指针(推荐):利用std::unique_ptr或std::shared_ptr自动管理内存,无需手动调用delete
#include <iostream>
#include <thread>
#include <memory>
using namespace std; 
class thread_obj {
public:
    void operator()(int x)
    {
        unique_ptr<int> a = make_unique<int>(x); // 智能指针自动分配并管理内存
        cout << *a << endl;
        // 函数结束时,unique_ptr会自动释放内存
    }
};
// main函数部分同上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:03:18