社区
C++ Builder
帖子详情
线程内存释放问题
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
打赏
收藏
线程内存释放问题
一个线程 只执行简单的代码 void __fastcall TMyThread::Execute() { FreeOnTerminate=true; int p=0; while(p<5) { p++; Sleep(1000); } } 该线程循环5次后会自动退出, 如果该线程只有一个实例,观察内存,线程结束后内存释放正常。 但是如果同时实例化多个该线程,所有线程结束后内存会增加,不明白是哪里出问题。 应该怎么解决?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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;
不是线程已经自动释放了吗?
JAVA多
线程
精讲下
线程
的同步(
线程
安全
问题
)l
线程
的死锁l
线程
间通信l
线程
组l
线程
池l 多
线程
的第三种实现方案l 匿名内部类方式使用多
线程
l 定时器的使用l 多
线程
面试题
c# timer 销毁_C# Timer 控件多
线程
内存
释放
第一次写博客,请大家见谅。C#的Timer控件是一个多
线程
的控件,当大量的访问其它控件的时候就会不断的消耗
内存
,虽然C#具备垃圾回收机制,但是也应该不断的进行
内存
的
释放
,防止在没有回收垃圾之前造成的系统崩溃,本人亲试,没有
问题
。代码如下:private void timer1_Tick(object sender, EventArgs e){//轮巡人员考勤数组,将新刷脸信息进行显示if (arr...
python
线程
执行完后
释放
内存
_Python中的
线程
终止与
内存
释放
但我注意到,
内存
并没有
释放
(gc.get_objects()不断增长)。实际上,这些对象是列表、dict等,而不是文件。在有没有办法手动
释放
资源?代码:import ctypesdef terminate_thread(thread):"""Terminates a python thread from another thread.:param thread: a threading.Threa...
python
线程
执行完后
释放
内存
_
线程
结束后
释放
内存
我正在开发的应用程序主要是API,但也有一个多
线程
后台作业处理系统,用于执行计划的作业以及临时API,它们需要很长时间才能获得即时的API响应。这将通过金枪鱼分叉10次。任何单个分叉的流程都能够接管要运行的作业,因此,在处理流程与API请求的服务之间,是平衡的。我面临的挑战是,每个进程将如何继续声明作业处理所需的最大
内存
量。有些作业需要1.5GB-2GB的
内存
。如果有足够的时间,最终所有10个进程...
java
线程
内存
释放
_方法内创建的
线程
,为什么方法结束了
线程
还不
释放
内存
publicclassMailboxIndexerCreaterextendsTimerTask{publicMailboxIndexerCreater(Mailboxsmailboxs,Stringwork_dir){newTimer().schedule(this,Time.MINUTE*0);}publicvoidrun(){ini...public class MailboxIndexer...
C++ Builder
13,825
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章