社区
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(); //释放内存 但释放不掉
...全文
1016
8
打赏
收藏
CComBSTR内存泄漏问题
我用vc做了个Com,因为有连接点,用到了CComBstr类型,发现每次用到CComBstr内存都会增加1K,而且无法释放,请高手解释.谢谢 char cData[1024]; memset(cData,0,1024); for()//对cData付值 CComBSTR bstrData(cData); //增长1K内存 调用连接点事件 bstrData.Detach(); //释放内存 但释放不掉
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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(); //才是释放内存
C
Com
BSTR
内存泄露的
问题
C
Com
BSTR
编辑 本词条缺少概述、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 外文名 C
Com
BSTR
对 象 ...转换
问题
,范围
问题
目录 1 名称解释 2 注意事项
Variant 与 内存泄露
今天遇到一个内存泄露的
问题
。是师兄检测出来的。Variant类型在使用后要Clear否则会造成内存泄露,为什么呢? Google一下找到下面一篇文章,主要介绍了
Com
的内存泄露,中间有对Variant的一些解释吧。 1. 引用...
BSTR
在使用过程中为什么会内存泄露呢
Don 't use
BSTR
, use ATL 's _
bstr
_t or MFC 's C
Com
BSTR
instead to avoid memory leak. Here is why: Case 1 with memory leak: line 1:
BSTR
Bstr
; line 2: pSomeObject-> Get_SomeString( &
Bstr
); line 3...
BSTR
使用误区以及隐藏的内存破坏和
内存泄漏
BSTR
使用误区以及隐藏的内存破坏和
内存泄漏
作者:magictong 简介
BSTR
的数据结构是什么样子并不是本文讨论的
问题
,但是却是本文的基础。在解决
COM
的跨平台编程的
问题
时,需要定义一种通用的字符串类型,它就...
正确的使用C
Com
SafeArray,C
Com
Variant和C
Com
BSTR
但是,使用这三个类型依然需要小心,因为使用不当的话,就会造成
内存泄漏
,或效率降低。 1. 如果拷贝两个
BSTR
假如我们一个
BSTR
,这个时候我希望复制一份
BSTR
,并丢弃之前的
BSTR
。通常我们会这么写: C
Com
BSTR
...
ATL
3,245
社区成员
48,539
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章