TerminateThread的问题

j8daxue 2011-08-08 09:43:14
程序一启动就开始一个线程,做一个比较耗时的网络操作(10~30s),有可能程序退出了,而这个操作都没完成。dll由别人提供,也没提供终止操作之类的方法,所以程序退出了可以在析构等或者使用TerminateThread。而等待的还没返回的话,进程没结束,再次启动程序,由于某些库的终结操作没完成,所以启动没反映。

使用TerminateThread则发现一个奇怪的问题,如果堆栈内的string是CString类型,被强制结束了则可看到明显的内存泄漏。但如果是stl的string或者TCHAR []则没有,最奇怪的是为什么内存泄漏,原因就是堆栈不会释放,CString或者其他自定义类的析构函数不会被调用到,但stl的string在程序退出时竟然调用到析构了,调用栈都是crt的代码或dll,不明白究竟做了什么。
...全文
217 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
j8daxue 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cnzdgs 的回复:]
string对象中定义了一个长度为16的字符数组,当字符串较短时则储存在这个数组中,如果字符串长度超过了数组,则在堆中分配内存。你可以查看string的定义及相关代码。
[/Quote]
昨天已经看到了,呵呵。
cnzdgs 2011-08-08
  • 打赏
  • 举报
回复
string对象中定义了一个长度为16的字符数组,当字符串较短时则储存在这个数组中,如果字符串长度超过了数组,则在堆中分配内存。你可以查看string的定义及相关代码。
xiaoguailong3 2011-08-08
  • 打赏
  • 举报
回复
强制终止的话会泄露。。正常!!
j8daxue 2011-08-08
  • 打赏
  • 举报
回复
另外有人能解释下我2L所提到的吗?貌似stl的string构造时会默认分配15bytes的内存,但我F10 F11半天一直没发现究竟什么地方分配的。
用户 昵称 2011-08-08
  • 打赏
  • 举报
回复
主程序退出的时候,要等待一下,如果有线程还在操作,不妨弹出个界面、吓吓用户,是否真的退出。
chenjiawei007 2011-08-08
  • 打赏
  • 举报
回复
没有执行到内存回收的代码,比如局部变量开辟内存,不会放到析构中去销毁,期间中止,泄露还是正常的。
Topsupper 2011-08-08
  • 打赏
  • 举报
回复
线程读写操作为什么不做成异步呢,最好是能让线程自动退出,强行终止内存泄漏不可避免。
ouyh12345 2011-08-08
  • 打赏
  • 举报
回复
既然强制结束进程,那么就不要管内存泄露了
但资源就真正地泄露了
j8daxue 2011-08-08
  • 打赏
  • 举报
回复
有空又试了下,可能是STL的string做了什么处理,构造函数会默认给分配15size的容量,然后assign,如果15<字符串长度,assign会调用分配器来分配内存。此时也会造成mem leak。<=15的话就不会,CRT会清理,不过这15字节的内存倒是没看出来什么地方分配的。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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