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).
//请有经验的朋友给点建议。谢谢

解决方案 »

  1.   

    运行中的程序才有“内存泄露”的说法,进程结束后,系统会把该进程的所有内存都释放掉。
    if(!PostMessage(hMainWnd, WM_MYMESSAGE, (WPARAM)buff, 0))
        delete[] buff;
    这两行代码有问题,PostMessage是把消息放入目标线程的消息队列后立即返回,所以消息还没来得及响应,buff就被释放了,响应消息时很可能产生异常。应该用SendMessage,或者由消息响应函数来释放内存。
      

  2.   

    没注意前面有个!号,如果只在失败的时候delete就没问题了。
      

  3.   

    做法好跟不做关键还是看应用。能够做到清理工作当然是最好,比如一个普通的EXE可能在退出的时候不清理不会有什么问题,但是当把代码编译成DLL之后,如果别人动态调用这个DLL,那么问题可能就出现了。但是,要想到的是,增加一个链表,你同样也增加了一重复杂度,毕竟内存你是在线程当中分配,并且可能使用的,此时如果做的工作不到位,你的主线程在子线程还没有退出之前就清理了链表,问题就远比你不释放来得糟糕得多。