代码改变世界

内存泄露的小问题(转载)

2007-02-10 13:05  Koy  阅读(377)  评论(0编辑  收藏  举报

_bstr_t GetMessage(){

    _bstr_t msg = "Hello,world!";
    return msg.Copy();

}

void MyFunction(){
    GetMessage();
}

内存有泄露。。。但是已解决。。。希望对大家有用!
(暂时放首页两天,也算和.NET相关,因为我们是aspx对这个COM+作interop的)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
前面的写法因调用copy产生了一个未包装的BSTR无人释放,因此有泄漏

后面的写法也不好,_bstr_t::operator wchar_t*() const并不生成新的BSTR串,在msg析构时也会释放自己生成的对象,因此SysFreeString(tmp)纯粹多此一举,不过从表面看SysFreeString两次释放同一个BSTR似乎没有什么副作用,因此这种写法使用应该没什么问题

这样
_bstr_t GetMessage()
{
_bstr_t msg = "Hello,world!";
return static_cast< wchar_t* >(msg);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
第一种写法改成
_bstr_t GetMessage()
{
_bstr_t msg = "Hello,world!";
return msg.copy(false);
}
亦可