本文档已存档,并且将不进行维护。

分配和释放 BSTR 的内存

Visual Studio .NET 2003                 
转自:
https://msdn.microsoft.com/zh-cn/library/cc485262(v=vs.71).aspx 

当创建 BSTR 并在 COM 对象之间传递它们时,必须小心地处理它们所使用的内存以避免内存泄漏。当 BSTR 停留在接口中时,在完成其使用后必须释放出它的内存。但是,如果 BSTR 传递出了接口,那么接收对象将负责它的内存管理。

一般情况下,分配和释放分配给 BSTR 的内存的规则如下:

  • 当调用进来一个需要 BSTR 参数的函数时,必须在调用之前为 BSTR 分配内存,并且在完成操作之后将其释放。例如:

    复制
    HRESULT IWebBrowser2::put_StatusText( BSTR bstr );// shows using the Win32 function
    // to allocate memory for the string:
    BSTR bstrStatus = ::SysAllocString( L"Some text" );
    if (bstrStatus == NULL)return E_OUTOFMEMORY;pBrowser->put_StatusText( bstrStatus );
    // Free the string:
    ::SysFreeString( bstrStatus );
    //...
    

  • 当调用进来一个返回 BSTR 的函数时,必须自己来释放字符串。例如:
    复制
    HRESULT IWebBrowser2::get_StatusText( BSTR FAR* pbstr );
    //...
    BSTR bstrStatus;
    pBrowser->get_StatusText( &bstrStatus );// shows using the Win32 function
    // to freee the memory for the string:
    ::SysFreeString( bstrStatus );
    

  • 当实现返回 BSTR 的函数时,请分配字符串,但不要释放它。接收函数会释放内存。例如:
    复制
    // Example shows using MFC's
    // CString::AllocSysString//...
    HRESULT CMyClass::get_StatusText( BSTR * pbstr )
    {try{//m_str is a CString in your class*pbstr = m_str.AllocSysString( );}catch (...){return E_OUTOFMEMORY;}// The client is now responsible for freeing pbstr.js调用ocx里的方法时,ocx里的方法不需要释放
    return( S_OK );
    }
    //...
    

转载于:https://www.cnblogs.com/andyliu1988/p/6093930.html

分配和释放 BSTR 的内存相关推荐

  1. C/C++动态二维数组的内存分配和释放

    C语言: 1 //二维数组动态数组分配和释放 2 //数组指针的内存分配和释放 3 //方法一 4 char (*a)[N];//指向数组的指针 5 a = (char (*)[N])malloc(s ...

  2. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

  3. 利用二叉树的思想来实现分配和释放内存方法

    虽然大部分系统都有提供内存动态分配和释放函数(即C语言中的malloc和free函数),但是在嵌入式开发中由于系统的限制往往需要自己来实现内存管理,如在有些平台上可动态申请的最大空间不能满足程序设计的 ...

  4. 如何简化临时内存的分配与释放

    描述:在编制 C++ 程序时,最常遇到的一个令人恼火的问题便是临时资源的分配与释放问题, 由于程序的逻辑关系通常很复杂,引发异常的可能性也很多,为了妥善处理运行时异常, 我们不得不在可能引发异常的任何 ...

  5. c语言内存分配与释放 不同类别变量的内存分配和释放的区别

    1.不同变量使用内存的区别 静态存储类别的变量:内存数量在编译时确定,程序开始执行时创建,程序结束时销毁.(static.const) 自动存储类别的变量:程序进入变量定义所在块时存在,离开块时销毁. ...

  6. C++/C--动态二维数组的内存分配与释放【转载】

    1 C语言_二维数组动态数组分配和释放 1.1 数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(cha ...

  7. FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  8. java怎么释放分配的内存,linux 内存的分配和释放,linux分配释放

    linux 内存的分配和释放,linux分配释放 了解内存分配机制(共享映射与请求分页) 通过 pmap 命令,可以获取用户进程逻辑地址空间中映射的内存信息: pmap -x $pid 其中 -x 表 ...

  9. C语言中多维数组的内存分配和释放(malloc与free)(转)

    C语言中多维数组的内存分配和释放(malloc与free)(转) 写代码的时候会碰到多维数组的内存分配和释放问题,在分配和释放过程中很容易出现错误.下面贴上一些示例代码,以供参考. 如果要给二维数组( ...

最新文章

  1. eventEmitter3源码分析与学习
  2. Java Review - LinkedList源码解读
  3. 6、HTML有序列表+无序列表+定义列表
  4. Boost:BOOST_VERIFY扩展的用法测试程序
  5. hofstede六个维度指数指标_五张图表 一看便知50指数基金如何选?
  6. leetcode面试题 10.03. 搜索旋转数组(二分法)
  7. 【Hihocoder - offer编程练习赛93 套题题解】交错01串(贪心,暴力)方格矩阵高度(模拟)数对(STLmultiset)修整土地(网络流)
  8. python实现搜索之二分查找
  9. java应用程序多态_java – 多态和n层应用程序
  10. Linux 基础知识系列第一篇
  11. javascript 设计模式之单例模式
  12. python使用有道翻译API翻译
  13. 分布式系统关注点——如何去实施「负载均衡」?
  14. python3下载url图片假死_利用Python 向FTP 上传图片,程序假死?
  15. Linux,Centos下 Tomcat8 修改jvm内存配置的新方法
  16. 三极管工作原理分析!精辟、透彻
  17. mysql存储过程出参和入参_数据库mysql存储中的入参出参理解
  18. Red Hat 镜像下载
  19. 【Python】实现给小仙女定时推送消息
  20. 手机网络游戏 一座尚待挖掘的金矿

热门文章

  1. LINQ中的Lambda表达式
  2. 使用 ADO.NET连接SQL Azure
  3. 中庸女比美女更有市场
  4. 谷歌提出COMISR算法:针对视频压缩的压缩感知超分辨率
  5. 冠军奖10万日元+10公斤柠檬!一个简单的柠檬图像分级竞赛
  6. ICCV NAS Workshop 最佳论文提名:通过层级掩码实现高效神经网络架构搜索
  7. Java二十三种设计模式 之代理(proxy)
  8. 用 Python 写软件原来这么简单
  9. C++中string、char[]、char*之间的转换
  10. VTK模块学习(一)