zoukankan      html  css  js  c++  java
  • BSTR在使用过程中为什么会内存泄露呢

    http://topic.csdn.net/t/20030429/20/1723435.html

    Don 't   use   BSTR,   use   ATL 's   _bstr_t   or   MFC 's   CComBSTR   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_t   AtlBstr;
    line   4:   AtlBstr   =   Bstr;       //   Memory   leak   here!!!

    In   line   1,   when   Bstr   is   declared   and   initialized,   a   call   to   SysAllocString   is   automatically   made   when   creating   the   Bstr   variable,   but   it   is   never   freed   later,   so   it   causes   memory   leak.

    Case   2   without   memory   leak:   (Solution   1)

    line   1:   BSTR   Bstr;
    line   2:   pSomeObject-> Get_SomeString(   &Bstr   );

    line   3:   _bstr_t   AtlBstr(   Bstr,   FALSE   );   //   avoid   a   memory   leak

    (Solution   2)
    line   1:   BSTR   Bstr;
    line   2:   pSomeObject-> Get_SomeString(   &Bstr   );

    line   3:   _bstr_t   AtlBstr;
    line   4:   AtlBstr   =   Bstr;  
    line   5:   ::SysFreeString(   Bstr   );   //   free   that   memory.

    解释:

    最重要的要理解一点,使用BSTR就象使用 c语言中的内存指针一样,分配了,必须在合适的地方释放 
    因此,记住,对应普通的BSTR,不能进行一般的赋值操作,就象你对已经分配了空间的指针,不能随便再次赋值一样。
    楼上说的对,可以使用其他的辅助的包装类,避免这些问题。
    但实际应用中,有许多更复杂的情况,简单地使用以上的方法不能解决
    所以,还是认真掌握其根本概念吧 
                           
    BSTR是一个字符串指针,声明的时候不会分配内存,当然需要使用者分配、释放内存,就像C里的char一样处理;而_bstr_t是封装了BSTR的类,它在析构函数中会释放该类变量所占的内存,所以无需使用者自己释放。
                           

  • 相关阅读:
    Flask使用mysql数据池
    Flask之WTForms
    Flask用Flask-SQLAlchemy连接MySQL
    Flask之中间件
    Flask之session相关
    Flask之请求和响应
    Flask路由系统与模板系统
    Flask之基本使用与配置
    Flask知识总汇
    Flask之视图函数
  • 原文地址:https://www.cnblogs.com/carl2380/p/1919422.html
Copyright © 2011-2022 走看看