内存泄露解决记录——BSTR字符串释放与VARIANT类型的释放

原创 2011年01月19日 11:58:00

发现的内存泄露有两种,一种是上篇提到的,某些窗口没有用DestroyWindow来释放资源,而是自己写的一个ForceClose函数,这导致了某些函数没被调用,比如PostNcDestroy。

另外就是一个内嵌浏览器中使用到的BSTR字符串没有释放造成的问题。

 

String Manipulation Functions Descriptions
SysAllocString Creates and initializes a string.
SysAllocStringByteLen Creates a zero-terminated string of a specified length.
SysAllocStringLen Creates a string of a specified length.
SysFreeString Frees a previously created string.
SysReAllocString Changes the size and value of a string.
SysReAllocStringLen Changes the size of an existing string.
SysStringByteLen Returns the length of a string in bytes.
SysStringLen Returns the length of a string.

以上是BAIDU 百科BSTR的字符串操作函数

 

问题都出在分配了BSTR字符串之后,没有SysFreeString

 

谁的屁股谁自己擦,在哪个函数里分配,就在哪个函数里释放。

 

CString str_url = “XXXXX”;

 

_Browser->Navigate(str_url.AllocSysString(),
         &flags,
         &target_frame_name,
         &post_data,
         &headers);

 

这样的调用理所当然地造成泄漏,Navigate里又不会将BSTR字符串释放。

 

我的解决办法是用一个BSTR中间变量保存字符串,使用完之后用SysFreeString()来释放。

 

觉得还是不多废话了,泄露的原因就是BSTR字符串,BSTR字符串数组,下面是关于如何使用DISPPARAMS和SAFEARRAY的文章

http://blog.csdn.net/debehe/archive/2008/10/30/3187195.aspx

BSTR使用误区以及隐藏的内存破坏和内存泄漏

BSTR使用误区以及隐藏的内存破坏和内存泄漏 作者:magictong 简介 BSTR的数据结构是什么样子并不是本文讨论的问题,但是却是本文的基础。在解决COM的跨平台编程的问题时,需要...
  • xl19900502
  • xl19900502
  • 2014年06月05日 12:34
  • 715

BSTR 的内存分配和释放

当创建 BSTR 并在 COM 对象之间传递它们时,必须小心地处理它们所使用的内存以避免内存泄漏。当BSTR 停留在接口中时,在完成其使用后必须释放出它的内存。但是,如果 BSTR 传递出了接口,那么...
  • wanglei9876
  • wanglei9876
  • 2014年11月22日 19:09
  • 895

BSTR向WideString赋值导致内存泄漏

COM中的BSTR向WideString赋值导致内存泄露
  • zhang_qxian
  • zhang_qxian
  • 2017年01月06日 08:59
  • 225

listView优化以及内存泄露问题

最经开发app使出现了由于ListView产生的内存泄露问题。我们知道内存泄露时很不好的。意味着,代码写的有点失败,需要做些优化改动。 经过这次的教训,以及在网上找了些资料,总结了一下,关于List...
  • IT_faquir
  • IT_faquir
  • 2016年04月16日 17:42
  • 4707

C#内存泄露与资源释放 经验总结

经验总结:C#并不是有了垃圾回收机制,你就可以对内存管理放任不管,其实在稍不注意的时候,可能就造成了内存泄露,或者超大内存占用~ 以下记录下遇到过的内存优化-内存泄露的问题与应对方案。 1...
  • Yokeqi
  • Yokeqi
  • 2014年11月13日 18:39
  • 10514

VC中BSTR、Char*、CString类型相互转换

1、char*转换成CString 若将char*转换成CString,除了直接赋值外,还可使用CString::format进行。例如: char chArray[] = "This is ...
  • mitesi
  • mitesi
  • 2014年04月08日 16:16
  • 1492

关于jacob支持BSTR类型的经验总结

作者:朱金灿来源:http://blog.csdn.net/clever101           jacob是实现Java和COM之间互操作的一个开源中间件。网上大多的程序示例基本上是使用jacob...
  • clever101
  • clever101
  • 2015年03月30日 23:33
  • 1577

iOS7 UIWebView内存泄露问题解决方法

转自:http://kimsungwhee.com/ios7-uiwebview%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2%E9%97%AE%E9%A2%98%E8%A7...
  • primer_programer
  • primer_programer
  • 2014年05月02日 01:10
  • 26823

Android实战开发之ViewPager图片回收处理内存溢出完美解决方案(含Fragment)

在Android实战开发中,ViewPager使用广泛,但使用ViewPager加载多个图片容易出现内存溢出的问题,解决此类内存溢出,需要主要注意以下2点: 1、是否进行过图片压缩处理; Op...
  • bobxie520
  • bobxie520
  • 2016年04月16日 14:30
  • 4329

COM组件,字符串数组的传递

前阵子做作业,需要用到COM。在ATL下开发简单的COM组件很简单,唯一的难点在于复杂参数的传递。比如说字符串数组,需要学习SAFFARRAY,bstr以及VARIANT的用法。     下面贴出代...
  • wwxie123
  • wwxie123
  • 2017年02月20日 13:42
  • 244
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存泄露解决记录——BSTR字符串释放与VARIANT类型的释放
举报原因:
原因补充:

(最多只允许输入30个字)