社区
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(); //释放内存 但释放不掉
...全文
1029
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
是由微软在
COM
接口中定义的一种Unicode字符串类型,它由
COM
库自动...
跟踪
BSTR
内存分配以查找
内存泄漏
rp=%2FKB%2Fcpp%2F726867%2FDemoAppFor
BSTR
Allocs.zip&download=true"可能是一个示例应用,包含了模拟
BSTR
内存泄漏
问题
的代码。通过下载并分析这个应用,你可以亲身体验和学习如何定位和修复
BSTR
相关的
内存泄漏
。 ...
VC中
BSTR
、Char和CString类型的转换
在Microsoft Visual C++ (VC++) 开发环境中,
BSTR
、Char和CString是三种常见的字符串处理类型,它们在不同的场景下有着各自的用途。...在处理字符串时,确保正确处理内存分配和释放是避免
内存泄漏
的关键。
对有关数据类型转换的整理
数据类型转换在编程中是常见的操作,特别是在处理各种数据时,确保数据的正确性和兼容性至关重要。...在处理字符串和其他类型之间的转换时,应始终注意内存管理,确保正确释放分配的内存,避免
内存泄漏
。
vc数据类型转换大全.doc
- 在需要
BSTR
与这些封装类型之间转换时,可以直接赋值,但需要注意内存管理,避免
内存泄漏
。 以上是VC++中数据类型转换的主要方法,这些转换在编程过程中经常被用到,以实现不同数据类型的兼容性和灵活性。理解和...
ATL
3,248
社区成员
48,529
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章