我的程序是一个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()的调用,
则内存泄漏的现象就不会发生.
    到底问题出在什么地方呢?我觉得我的代码没有什么毛病阿

解决方案 »

  1.   

    void Fire_Event1( CStringW msg )
    {
        _bstr_t s(msg);
        __raise OnEvent1( s );
    }
    void Fire_Event2( CStringW msg )
    {
        _bstr_t s(msg);
        __raise OnEvent2( s );
    }
       
    函数中的_bstr_t变量要释放;
      

  2.   

    _bstr_t 是一个类,会在析构函数中调用::SysFreeString()的,
    不应该是这里的泄漏,而且,我的client.exe和server.exe同时都会
    内存泄漏,按说,client.exe中的事件就是 TServerEvent1( BSTR msg ),
    msg也不需要由自己释放, 可是即使我释放msg,内存泄漏还是发生,
    真搞不懂.如下:
    TMainForm::TServerEvent1( BSTR msg )
    {
        AnsiString MsgString( msg );
        ::SysFreeString( msg );
        TestEdit->Lines->Add( MsgString );
    }
      

  3.   

    可能不是Fire_EventX()的问题。
    将server.exe中的Fire_EventX()函数不用参数试试。