社区
ATL
帖子详情
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(); //释放内存 但释放不掉
...全文
1031
8
打赏
收藏
CComBSTR内存泄漏问题
我用vc做了个Com,因为有连接点,用到了CComBstr类型,发现每次用到CComBstr内存都会增加1K,而且无法释放,请高手解释.谢谢 char cData[1024]; memset(cData,0,1024); for()//对cData付值 CComBSTR bstrData(cData); //增长1K内存 调用连接点事件 bstrData.Detach(); //释放内存 但释放不掉
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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(); //才是释放内存
BSTR
导致内存泄露
问题
在开发中对经常会由于粗心或遗漏而导致的
BSTR
内存泄露
问题
,特意研究并进行了整理,内部有教详细的说明,希望对大家能有所帮助。(注:涉及公司版权
问题
,仅供参考、谢谢)
跟踪
BSTR
内存分配以查找
内存泄漏
如果您正在寻找与
BSTR
指针有关的
内存泄漏
,则此技巧可能与您非常相关。
VC中
BSTR
、Char和CString类型的转换
VC中
BSTR
、Char和CString类型的转换.
对有关数据类型转换的整理
对有关数据类型转换的整理
vc数据类型转换大全.doc
vc数据类型转换大全.doc
ATL
3,248
社区成员
48,529
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章