应该用哪个

OhFish 2008-12-01 01:03:01

WorkThread()
{
char *buff = new char[size];
............

if(!PostMessage(hMainWnd, WM_MYMESSAGE, (WPARAM)buff, 0))
delete[] buff;

............
}

//如果UI Thread还没有来得及处理我的消息 就关闭了。那么这里的buff将内存泄漏。

//我有两个方案,不知对不对。
//方案一: 在UI的OnClose()中,利用peekmessage来清除我的消息。
//方案二:创建一个myBuffList, 在程序退出时清除myBuffList.

//第一个方案不知是否可行? 第二个方案感觉多余(有现成的系统消息队列,为什么还要自己创建list).
//请有经验的朋友给点建议。谢谢
...全文
58 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
OhFish 2008-12-01
  • 打赏
  • 举报
回复
谢谢大家,谢谢僵哥。

僵哥 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 OhFish 的回复:]
回复2,3楼

你们说得没错,但我不认为那是个好的做法。
请问你们做项目在程序退出时都不做清除工作吗?
[/Quote]
做法好跟不做关键还是看应用。能够做到清理工作当然是最好,比如一个普通的EXE可能在退出的时候不清理不会有什么问题,但是当把代码编译成DLL之后,如果别人动态调用这个DLL,那么问题可能就出现了。但是,要想到的是,增加一个链表,你同样也增加了一重复杂度,毕竟内存你是在线程当中分配,并且可能使用的,此时如果做的工作不到位,你的主线程在子线程还没有退出之前就清理了链表,问题就远比你不释放来得糟糕得多。
OhFish 2008-12-01
  • 打赏
  • 举报
回复
回复2,3楼

你们说得没错,但我不认为那是个好的做法。
请问你们做项目在程序退出时都不做清除工作吗?
路人乙2019 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jason_wentzel 的回复:]
建议用链表,程序退出时清链表
[/Quote]对,最好为节点增加一个序列号,在主线程中判断是否已处理,
cnzdgs 2008-12-01
  • 打赏
  • 举报
回复
没注意前面有个!号,如果只在失败的时候delete就没问题了。
cnzdgs 2008-12-01
  • 打赏
  • 举报
回复
运行中的程序才有“内存泄露”的说法,进程结束后,系统会把该进程的所有内存都释放掉。
if(!PostMessage(hMainWnd, WM_MYMESSAGE, (WPARAM)buff, 0))
delete[] buff;
这两行代码有问题,PostMessage是把消息放入目标线程的消息队列后立即返回,所以消息还没来得及响应,buff就被释放了,响应消息时很可能产生异常。应该用SendMessage,或者由消息响应函数来释放内存。
僵哥 2008-12-01
  • 打赏
  • 举报
回复
UI线程通常是主线程,如果连主线程都退掉了,那还管它什么内存泄露,进程没了,内存自然就交还了.
孤客天涯 2008-12-01
  • 打赏
  • 举报
回复
建议用链表,程序退出时清链表

15,471

社区成员

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

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