_BSTR_T内存泄漏
_bstr_t memory leak
我有一个C 代码。但这无法正确释放记忆。告诉我我错了,这是我的代码
1 void MyClass::MyFunction(void)
2 {
3 for (int i=0; i<count; i++)
4 {
5 _bstr_t xml = GetXML(i);
6 // some work
7 SysFreeString(xml);
8 }
9 }
getxml(第5行)返回我的BSTR。在这种记忆中,程序增加了。但是在Sysfreestring(第7行)后,内存不会释放。我在这里做错了什么?
首先:
// This makes a copy.
// This is where the leak is. You are leaking the original string.
_bstr_t xml = GetXML();
// You want to use this, to attach the BSTR to the _bstr_t
_bstr_t xml = _bstr_t(GetXML(), false);
第二,不要这样做:
SysFreeString(xml);
_bstr_t
类将为您做。
第三,BSTR不会立即将内存释放到OS,它最近使用字符串来使Sysallocstring更快。您不应该期望看到记忆使用量在sysfreestring后直接下降。
您可以为调试目的控制此行为:
- http://support.microsoft.com/default.aspx?scid=kb; en-us;q139071
最后,在任务管理器中查看内存使用时,您需要查看"提交大小"列"不工作集"列。转到菜单 ->查看 ->选择列显示列。还要注意,这实际上只有一段时间的帮助 - 可能不会立即将内存发布到操作系统,但是如果您没有泄漏,则不会在几个小时内永远上升。
。我想您应该使用:
xml.Attach(GetXML(i));
操作员=看起来它实际上是在分配新值 - 这意味着复制它。getxml返回的值保持未固定。
也不需要Sysfreestring(XML);
任务管理器仅提供分配给该过程的内存量。当C 释放内存(免费)时,它不一定会将内存返回操作系统,因此任务管理器不一定会在过程结束之前显示内存。
任务管理器可以显示的是,如果您继续分配内存而不是发布记忆,那么该过程的内存大小将继续增加,如果发生这种情况,您可能会泄漏内存。
编程时,您需要使用内存介绍者来查看是否要释放内存。在Windows中,我使用Rational的净化为我提供了此信息,但要花很多钱。MS C运行时可用于跟踪内存。MSDN在此处提供了一个概述,阅读并遵循TH链接。
关于您的代码以及其他评论,并回答使用_bstr_t类的点之一是为您进行内存和其他资源管理,因此您不应致电Sysfreestring
_BSTR_T的驱动器将调用sysfreestring(XML),因此您无需再次致电Sysfreestring(XML)。额外的免费内存将导致崩溃。
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存