社区
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(); //释放内存 但释放不掉
...全文
1075
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
和_
bstr
_t的关联与区别
出处:http://blog.sina.
com
.cn/s/blog_570379cc0100n87s.html C
Com
BSTR
, _
bstr
_t 使用原则 1. 二者都是对
BSTR
进行操作的智能指针,提供了一些功能来方便地操作
BSTR
, C
Com
BSTR
是ATL对B
请各位帮忙看看这个
内存泄漏
问题
,该如何解决?
BSTR
http://www.cndev.org/forum/m?pid=286093昨天代码改动的多,贴错了一些,实际上,最初的代码是这样的: XMLDOC->createElement(C
Com
BSTR
(L"RoadNo"),&pElement); pElement->put_tex
C
Com
BSTR
的生命期
C
Com
BSTR
会自动管理字符串的内存空间,在析构时释放空间。由于C++对象在出其作用域时会进行析构。所以有一些情形下,使用C
Com
BSTR
容易犯下错误。来看以下代码:
BSTR
bstr
1 = C
Com
BSTR
(L"hello");
BSTR
bstr
2 = C
Com
BSTR
(L"world"); TRACE(L"%s, %s\n",
bstr
1,
bstr
...
Com
BSTR
的使用
用 C
Com
BSTR
进行编程 Visual Studio .NET 2003 3(共 3)对本文的评价是有帮助 - 评价此主题 ATL 类 C
Com
BSTR
提供对
BSTR
数据类型的包装。尽管 C
Com
BSTR
是一个有用的工具,但有一些情况需要特别小心。 转换
问题
范围
问题
显式释放 C
Com
BSTR
对象 在循环中使用 C
Com
BSTR
对象...
BSTR
使用误区以及隐藏的内存破坏和
内存泄漏
BSTR
使用误区以及隐藏的内存破坏和
内存泄漏
作者:magictong 简介
BSTR
的数据结构是什么样子并不是本文讨论的
问题
,但是却是本文的基础。在解决
COM
的跨平台编程的
问题
时,需要定义一种通用的字符串类型,它就这样被发明了,而且它的结构很容易匹配到不同的编程环境中,对于C++程序员来说,要记住的最基本的一点就是分配
BSTR
结构时,并不是简单的调用new、malloc就可以完成的
ATL
3,248
社区成员
48,530
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章