我的程序是一个server.exe 和一个client.exe,
server.exe是VC.net下用ATL写的一个Free Thread Model的COM服务器程序,
client.exe是C++ Builder 6写的客户程序, 在C++ Builder里用import typelib
把server.exe注册的接口引入, 包装成TServer组件, client.exe在Form上加入
这个组件. server.exe里的若干个线程会通过事件接口不断通知client.exe,
代码是用了VC.net引入的关键字 "__raise",如下:
比如:
void Fire_Event1( CStringW msg )
{
_bstr_t s(msg);
__raise OnEvent1( s );
}
void Fire_Event2( CStringW msg )
{
_bstr_t s(msg);
__raise OnEvent2( s );
}
程序运行后,没有错误,client.exe中正常显示事件发生收到的消息,
但是随着事件不断调用,server.exe和client.exe的内存消耗都会越来越多,
直到最后耗光内存.如果在server.exe中去掉对Fire_EventX()的调用,
则内存泄漏的现象就不会发生.
到底问题出在什么地方呢?我觉得我的代码没有什么毛病阿
server.exe是VC.net下用ATL写的一个Free Thread Model的COM服务器程序,
client.exe是C++ Builder 6写的客户程序, 在C++ Builder里用import typelib
把server.exe注册的接口引入, 包装成TServer组件, client.exe在Form上加入
这个组件. server.exe里的若干个线程会通过事件接口不断通知client.exe,
代码是用了VC.net引入的关键字 "__raise",如下:
比如:
void Fire_Event1( CStringW msg )
{
_bstr_t s(msg);
__raise OnEvent1( s );
}
void Fire_Event2( CStringW msg )
{
_bstr_t s(msg);
__raise OnEvent2( s );
}
程序运行后,没有错误,client.exe中正常显示事件发生收到的消息,
但是随着事件不断调用,server.exe和client.exe的内存消耗都会越来越多,
直到最后耗光内存.如果在server.exe中去掉对Fire_EventX()的调用,
则内存泄漏的现象就不会发生.
到底问题出在什么地方呢?我觉得我的代码没有什么毛病阿
{
_bstr_t s(msg);
__raise OnEvent1( s );
}
void Fire_Event2( CStringW msg )
{
_bstr_t s(msg);
__raise OnEvent2( s );
}
函数中的_bstr_t变量要释放;
不应该是这里的泄漏,而且,我的client.exe和server.exe同时都会
内存泄漏,按说,client.exe中的事件就是 TServerEvent1( BSTR msg ),
msg也不需要由自己释放, 可是即使我释放msg,内存泄漏还是发生,
真搞不懂.如下:
TMainForm::TServerEvent1( BSTR msg )
{
AnsiString MsgString( msg );
::SysFreeString( msg );
TestEdit->Lines->Add( MsgString );
}
将server.exe中的Fire_EventX()函数不用参数试试。