首页
社区
课程
招聘
[求助]远程dll线程资源释放问题
发表于: 2011-4-25 12:18 5188

[求助]远程dll线程资源释放问题

2011-4-25 12:18
5188
我在 计算器 里注入了一个dll,在dll里创建了一个线程,什么都不做,只是循环常驻

var
  test: tstringlist;
begin
  test := tstringlist.create;
  // 线程开始
  while true do
  begin
  // 这里判断程序是否退出而跳出循环
// 但是程序一退出,线程立马结束了,后面的语句不会执行
  sleep(100);
  end;
  // 线程结束
  test.free;
end;

我想在 计算器 退出时释放这个线程
在dll的DLL_PROCESS_DETACH中做处理,但是经过调试发现计算器退出后所有线程都立即结束了,不会执行后面的test.free
这样就造成了内存泄漏

不知道有人碰到过这个问题没,怎么解决?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 692
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
依我的拙见, 首先, 你在dll的DLL_PROCESS_DETACH中作处理没用,系统要退出一个进程时, 会首先结束该进程中运行的线程, 也就是说线程的退出在释放dll前面,这样,当所有的线程退出后,操作系统释放该进程占用的所有资源。

  还有就是, 就算后面的test.free不会执行,但是在进程退出后,操作系统会保证释放该进程占用的所有资源,他会为你擦干屁股。这种情况不会造成内存泄漏。这也是操作系统的基本职责。

  内存泄漏是指在该进程运行期间,其某项操作申请了内存,而未释放,导致该进程运行期间内存不够,系统会挂掉该进程。
2011-4-27 09:20
0
雪    币: 319
活跃值: (951)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
嗯,谢谢解答,我发现线程析构函数还是能被执行到,在这里做出释放就可以了
2011-4-27 12:10
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
建议你这么写。
  test := tstringlist.create;
   try
      //不管这里代码是否异常,都会强制释放已经分配的对象资源
  finally
     test.free;
  end;

可以理解成一个析构函数,用来强制释放资源的!
2011-4-28 15:44
0
游客
登录 | 注册 方可回帖
返回
//