• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 我的智能指针为什么要手动release?

我的智能指针为什么要手动release?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了release,release是什么意思,telex release,release my soul,release date等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 我的智能指针为什么要手动release?
描述:

我如果用CoInitialize(NULL)去初始化 COM library, 即使我定义的是智能指针, 当用完指针, 还是要调用release,不然会有泄漏, 但是如果我用AfxOleInit()代替CoInitialize()去初始化, 则不需要再加上spFun.Release();为什么?
void test()
{//::CoInitialize( NULL ); //如果在这里初始化,则要注意智能指针的释放
CComQIPtr < IFun, &IID_IFun > spFun;
HRESULT hr = spFun.CoCreateInstance( CLSID_Fun );
ASSERT( SUCCEEDED( hr ) );
        ....//使用指针
spFun.Release(); // 正解
//::CoUninitialize();
}


解决方案1:

如果你在CoInitialize(NULL);下行加上"{"和CoUninitialize();上行加上"}"就不会出错了。
为什么呢?+_+
原因在于原来的CoInitialize所开的套间在CoUninitialize();后已经被关闭。
而智能指针的组件对象却并没有释放,直到程序调用CComPtr<ITestCOMPtr>的析构函数时才调用
ITestCOMPtr的Release方法,但是这时候,套间已经不在了,所以导致了程序的崩溃。在组件
的生命周期很短的时候,智能指针的使用基本是无害的,并且有时是非常方便的。
所以在使用智能指针时有以下建议:
1. 当对象的生命周期很长要小心使用。
2. 当对象的生命周期不确定时不要使用。
3. 千万不要使用全局的智能指针。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • visualc++60我想生成一个可执行程序release而不是调试debug一个,怎么生成出来的程序没有出现在release文件夹里面,甚至根本就没
  • 作了一个atlcom在debug下一切正常,在Release下Build时出错,望高手指点!!
  • VS2008编release版本报缺少mfcs42lib
  • 我的atl组件debug版本注册成功并能正常调用,但releaseminidependence版本注册成功,但无法正常调用,说是我的类不存在??
  • 重写QueryInterface,AddRef,Release应该注意些什么?我这段代码怎么总是有问题。
  • 为什么用CComPtr<IObj>创建的对象不能Release,而用IObj创建对象指针,就可以Release?
  • release运行出错MFC42DLL
  • 关于Release函数中deletethis的问题
  • VC6下调试runtocursor为什么不生效
  • Debug版本出错Release版本运行正常是怎么回事?

相关文章

  • 2017-06-05 如何知道當前DLL函數的前一調用者的文件名?
  • 2017-06-05 关于callback函数和线程的很基础的问题
  • 2017-06-04 关于方法返回值的问题请教大家!着急,在线等!!!!
  • 2017-06-04 ATL控件调用RegisterDragDrop后,退出程序后,进程管理器中还能找到
  • 2017-06-04 请问谁有com技术内幕第十三章的源码啊?
  • 2017-06-05 为何VC中要用_declspecdllexport)的方式而不用_stdcall方式?
  • 2017-06-04 BEGIN_EVENTSINK_MAPCTdaxDlg,CDialog是怎么出来的
  • 2017-06-05 关于CoUninitialize
  • 2017-06-04 有人遇到过库文件的错误么?求救大家
  • 2017-06-04 关于IWebBrowser2和MSActiveAccessibility接口问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 为什么在属性页中弹出的右键菜单没响应?!!
    • 100分求教vc++word转PDF
    • MSHTML问题
    • 请问我用#import导入了别人的COM组件后,应该如何创建里面的对象啊?
    • 为什么我在winxp下安装WH_CBT和WH_CALLWNDPROC钩子时一起动就死机????
    • 关于用#import编译指令创建COM对象。
    • 能不能显示地引出类
    • 各位大哥,大姐们,上面的那问题(高分求一简单程序)也没什么难度吧,怎么没人回呢???
    • 能推荐几本学com的书吗
    • DataGridAdo

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有