使用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大小的堆内存。
修正方案
- 手动调用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; }
- 使用智能指针(推荐):利用
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
相关产品推荐
相关产品推荐

