在1线程中用PostMessage往主窗体发消息,消息数据在堆中生成传指针到主窗体,但主窗体关闭时,可能线程还在发消息,造成内存泄漏,怎么解
1.线程不用SendMessage发消息
2.主窗体不准备用Wait...之类的同步函数,主要是防止主窗体阻塞消息处理
谁有好的方法,或者我的思路不正确?
问题点数:0、回复次数:6Top
1 楼lilylovey(楚云飞)回复于 2004-08-03 18:33:37 得分 0
你可以在主窗口中建立消息处理函数,在消息处理函数中处理你的指针数据。当主窗口关闭时,消息肯定发不出去了(发给谁?),此时可以中止你的线程,或者时挂起。
建议是数据在那里生成,在那里删除,就是在一个对象或者模块里去管理这些生成的内存块。当然也可以是用完就删除,但这样常常会出错。指针本身并不造成泄漏,而是你没有管理你生成的内存。Top
2 楼kufan(我是真的不会表达我的爱)回复于 2004-08-04 09:05:55 得分 0
线程在堆中生成消息数据,获得1指针,通过PostMessage将指针发给主窗体,主窗体处理消息然后delete堆数据,现在的问题是关闭主窗体时,线程还在产生堆消息数据,它PostMessage到主窗体时,主窗体可能已不能处理消息了,所以就不能delete堆数据,产生泄漏。
我没有做强制关闭线程的处理,大虾们都说这样不好,主窗体也没有使用Wait...之类的同步函数,我这样做有什么问题吗?Top
3 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-08-04 09:20:02 得分 0
其实不光是你说的内存泄漏,如果你是不断的调用PostMessage,还有可能造成堆被破坏。为防内存泄漏可以采用智能指针。Top
4 楼basboy(basboy)回复于 2004-08-04 09:42:02 得分 0
其实我觉得你违反了“在同一个层面上分配和释放内存的错误”,你看这样解决行么
class mainwind()
{
.....
someobject * newobject()
{
if(FLASE==IsWindow(this->mhWnd))
return NULL;
//---在这里分配了内存
return new(xxxxx)
}
private:
}
//----------thread---------------------//
someobject * p=mainwnd->newobject();
if(NULL!=p)
{
//--处理p对象----------//
.....
//-------------------//
postmessage(mainwnd->mhWnd,XXXX,p,0);
}
你觉得如何,这样分配和删除都是在mainwnd中进行的,非常好处理
Top
5 楼basboy(basboy)回复于 2004-08-04 09:42:44 得分 0
不然使用内存池也可以,要麻烦一点Top
6 楼kufan(我是真的不会表达我的爱)回复于 2004-08-04 09:46:42 得分 0
ok,思路很好,我试试。Top



