线程内存释放问题

futurecs 2012-07-03 09:09:07

一个线程 只执行简单的代码

void __fastcall TMyThread::Execute()
{
FreeOnTerminate=true;
int p=0;
while(p<5)
{
p++;
Sleep(1000);
}
}

该线程循环5次后会自动退出, 如果该线程只有一个实例,观察内存,线程结束后内存释放正常。

但是如果同时实例化多个该线程,所有线程结束后内存会增加,不明白是哪里出问题。

应该怎么解决?
...全文
416 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
greenspan 2012-07-16
  • 打赏
  • 举报
回复
编译器作了工作导致,没有还给系统,下次分配快点?
fxworld 2012-07-12
  • 打赏
  • 举报
回复
回答这个问题估计需要微软搞内存管理器的人出面才能解释清楚,呵呵。

不妨这样理解,os使用内存的过程大致包括:虚拟内存保留->物理内存提交->反提交->内存释放。

操作系统要运行很多App,每个App都有大量的分配内存然后释放内存的过程,这里就有一个运行效率的问题,如果每次内存使用后都要释放内存,则可能导致App的运行速度降低,那么如果在申请内存后在不再使用时不释放内存,而是给这块内存加一个标志,表示这块已经提交的内存现在可以被其它需要内存的对象使用了,这样就避免了App每次使用内存都要重复的 保留-提交-反提交-释放 的过程,那么运行效率也可以得以提高。

我这样理解是有依据的,有很多程序员都说,在使用windows的VirtualAlloc函数后怎么运行速度比用HeapAlloc反而慢了,HeapAlloc内部是调用 VirtualAlloc的,为什么反而慢了? 我觉的这就是因为在程序员使用 VirtualAlloc函数后,每次分配的内存不用后,都去释放了内存,而HeapAlloc内部则做了优化。





古典概型 2012-07-10
  • 打赏
  • 举报
回复
不建议使用VCL或者MFC等类库提供的线程类,直接windows api来自己控制更好
futurecs 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
按我的理解,线程类应该是对线程操作的封装,是一个正常的C++类,在线程结束后,线程类并不消失,需要显式delete掉
[/Quote]

我一开始也是这么理解的,但是我试着维护一个ThreadList 新建一个线程的时候就把指针加入到List中
最后所有线程结束后我显式的把 List中的所有new 出来的线程都 delete 掉了 多出来的内存依然没有被释放
futurecs 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
可以读出,并不代表有效

就好像,你扔了个瓶子在垃圾桶,在垃圾桶被人清理之前,瓶子一直在那里的,你能看到,但是你不知道,他什么时候会被清理
[/Quote]

那这部分内存的回收是跟系统内存回收机制有关系吗? 如果大量的实例化该线程,是否会导致内存溢出?
dataxdata 2012-07-03
  • 打赏
  • 举报
回复
按我的理解,线程类应该是对线程操作的封装,是一个正常的C++类,在线程结束后,线程类并不消失,需要显式delete掉
LinuxCard 2012-07-03
  • 打赏
  • 举报
回复
可以读出,并不代表有效

就好像,你扔了个瓶子在垃圾桶,在垃圾桶被人清理之前,瓶子一直在那里的,你能看到,但是你不知道,他什么时候会被清理
futurecs 2012-07-03
  • 打赏
  • 举报
回复
还有,如果在 线程的public: 中定义一个变量
int x;

在Execute 中给 x赋值 x=100;


创建线程
TMyThread *MT=new TMyThread(true);
MT->Resume();

我已经设置了FreeOnTerminate=true;

在Eventlog 中显示线程退出后,为何我依然可以访问 MT->x ? 可以读出x=100;

不是线程已经自动释放了吗?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧