CComBSTR内存泄漏问题

CathySun118 2007-04-18 06:05:02
我用vc做了个Com,因为有连接点,用到了CComBstr类型,发现每次用到CComBstr内存都会增加1K,而且无法释放,请高手解释.谢谢
char cData[1024];
memset(cData,0,1024);
for()//对cData付值

CComBSTR bstrData(cData); //增长1K内存
调用连接点事件

bstrData.Detach(); //释放内存 但释放不掉
...全文
1016 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
healer_kx 2007-05-23
  • 打赏
  • 举报
回复
我以为以楼主的星星,不会不知道这个的,一定有其他的问题存在。
warrior740 2007-05-23
  • 打赏
  • 举报
回复
你不Detach()就可以自动释放了
如果要Detach()那就要在接收连接点事件的时候释放
littlegang 2007-05-23
  • 打赏
  • 举报
回复
#include "atlbase.h"
void myloop()
{

char cData[1024];
memset(cData,0,1024);
for (int i = 0; i < 1000; i++) cData[i] = 'a';
CComBSTR bstrData(cData);

}
BOOL CFormViewDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;

// TODO: add reinitialization code here
// (SDI documents will reuse this document)

for (int j=0; j < 1024; j++)
myloop();
return TRUE;
}

测试下来,第1次“新建”增加了一些内存,以后不再增加
samsun2000 2007-05-23
  • 打赏
  • 举报
回复
/////////// 楼主的代码
void test()
{
char cData[1024];
memset(cData,0,1024);
for()//对cData付值

CComBSTR bstrData(cData); //增长1K内存
调用连接点事件
}

////////////// 我的看法
语句“CComBSTR bstrData(cData);”执行时,会找cData结束符,如果cData有500个有效数据,bstrData会申请1000Byte(即500wchar_t)的内存,存储cData的宽字符版。不过这不会造成问题,因为像大家说的,bstrData析构时会自动释放内存。

不过因为操作系统的原因,用“任务管理器”观察,应用程序使用的内存数量未必马上反映出这一变化。可能累计到5k会释放一次。

如果你的test方法循环执行,内存累计增加很多仍不释放,建议在其他地方查找问题。会不会连结点对象里面有问题?楼主把后面那些代码都贴出来看看吧
eduyu 2007-05-22
  • 打赏
  • 举报
回复
CComBSTR是智能指针类,析构函数会自动释放内存,你不用操心的。楼上已经列出了析构函数,你仔细理解一下。
CathySun118 2007-04-19
  • 打赏
  • 举报
回复
我刚开始是这样的的,函数结束后,内存没有释放,然后我在函数尾增加bstrData.Empty(); 还是不行,实在想不明白,我以前也是这样用的,就没有问题,难道和系统有关
void test()
{
char cData[1024];
memset(cData,0,1024);
for()//对cData付值

CComBSTR bstrData(cData); //增长1K内存
调用连接点事件
}
ks_gq 2007-04-18
  • 打赏
  • 举报
回复
楼主看以下代码, 代码就是CComBSTR的实现。
~CComBSTR()
{
::SysFreeString(m_str);
}

BSTR Detach()
{
BSTR s = m_str;
m_str = NULL;
return s;
}

Detach只是将控制权放弃掉,没有释放, 将m_str设为NULL, 当CCOmBSTR析构的时候就不会释放了。
使用CComBSTR不需要你调用什么函数去释放, 声明周期结束的时候又CComBSTR的析构函数负责释放。
huzs_82 2007-04-18
  • 打赏
  • 举报
回复
bstrData.Detach(); //释放内存 但释放不掉
这个没有释放,实际上把内存放出去流浪了.
bstrData.Empty(); //才是释放内存

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧