CComPtr对象作为参数进行 1.值传递 2.引用传递 3.做为返回值的注意事项

深入理解c++多线程:(一)detach使用隐患 文章目录一、其他构造线程的方法二、使用detach的隐患三、结论 一、其他构造线程的方法 c++线程,除了可以利用普通函数创建线程外,还有其他创建线程的方法: 类对象 Lambda表达式 具体使用方法如下: #include <thread> using namespace std; class TA { public: void operator ()() { pri... 阅读详情

1.导致内存泄露的一种调用方式:

下面方法是错误的:
IA *pA=NULL;
p->QueryInterfaces(...,&pA);//从某个已有接口查询获取IA
CComPtr<IA> spA(pA)
QueryInterface方法会导致pA->AddRef被调用一次,CComPtr<IA>构造函数又会调用一次AddRef,而最后spA析构时只调用了一次Release,因此COM对象没有被销毁,内存泄露了。

 

 

正确做法如下:

    IA *pA=NULL;
    p->QueryInterfaces(...,&pA);
    CComPtr<IA> spA;
    spA.Attach(pA);


或者
    CComPtr<IA> spA(pA)
    p->QueryInterfaces(...,&pA.p);

 

2.CComPtr内部对引用类型产生Assert原因

 

不能使用的operator&
   //The assert on operator& usually indicates a bug.  If this is really
    //what is needed, however, take the address of the p member explicitly
.
    T** operator&() throw()
    {
        ATLASSERT(p==NULL);
        return &p;
    }

    当你的CComPtr的p成员变量(集成而来的)不为NULL时,debug模式下会弹出错误对话框。看看上面的注释,这个函数被设计用来防止对智能指针直接调用取地址操作符的。实在要用,请用这种方法:&sp.p。

 

3.CComPtr内部operator*

operator*

    T& operator*() const
    {
        ATLENSURE(p!=NULL);
        return *p;
    }

    有了这个操作,我们就可以使得CComPtr拥有和普通指针同样的行为,通过*p来获得p所指对象的引用。

 

4.CComPtr内部operator T*

operator T*
    operator T*() const throw()
    {
        return p;
    }
    这是个类型转换操作。调用方法如下:
    CComPtr<IUnknown> sp=...
    IUnknown* p=(IUnknown*)sp;

 

5.CComPtr内部CopyTo

CopyTo
_Check_return_ HRESULT CopyTo(_Deref_out_opt_ T** ppT) throw()
    {
        ATLASSERT(ppT != NULL);
        if (ppT == NULL)
            return E_POINTER;
        *ppT = p;
        if (p)
            p->AddRef();
        return S_OK;
    }
    将自己的接口拷贝个参数指针,并调用AddRef。

6.CComPtr内部Attach和Detach方法

    void Attach(_In_opt_ T* p2) throw()
    {
        if (p)
            p->Release();
        p = p2;
    }
    // Detach the interface (does not Release)
    T* Detach() throw()
    {
        T* pt = p;
        p = NULL;
        return pt;
    }

    Attach方法先释放原先p所指接口,然后接受新接口,注意,不会导致AddRef调用。
    Detach方法将p设置为NULLL,然后返回接口。如果外部调用需要保存返回的接口,否则就遗失了。

Android11.0系统中适配EC20模块4G及GPS功能 本文主要描述在RK3568Android11中适配EC20模块,启用4G与GPS功能。 阅读详情

相关推荐

AIDD机器学习深度学习药物发现与设计教程总结

AIDD(AI Drug Discovery & Design):是近年来非常火热的技术应用,且已经介入到新药设计到研发的大部分环节当中,为新药发现与开发带来了极大的助力。倾向于机器对数据库信息的自我学习,可以对数据进行提取和学习,一定程度上避免了化合物设计过程中的试错路径,同时还会带来很多全新的结构,为药物发现打破常规的结构壁垒。覆盖了机器学习和深度学习,能与新药研发相结合并实质性的应用到靶点预测、高通量筛选、药物设计、药物的ADMET性质预测等;且算力方面,由早期应用于药物发现领域的决策树、随机

wutianlin0723的博客 6819

CComPtr用法

CComPtr用法 COM接口指针很危险,因为使用过程中需要每一个使用者都要严格并且正确的AddRef和Release,一旦出现问题,就会造成对象不能被正常释放,或者对象被重复删除,造成程序崩溃。所以使用COM接口,必须小心翼翼才行。 但是,即使所有的代码中,都正确...

aimang9690的博客 588

Windows10开机无限蓝屏(SrtTrail.txt)

这个问题已经有很多的大佬发过解决办法了,这里仅仅作为自己日后方便查找所写文章 无法开机——自动修复失败,报SrtTrail.txt文件错误,且陷入无限蓝屏的循环 事故 故事的起因是这样的: 开开心心的组装电脑,花了几天时间来配置,然后发现USB3.0的接口太少,于是在某宝上搞到一张pcie转7口USB3.0的转接卡,往电脑上一插 插电,开机,电流轻松跑上去 然后,它和原来的磁盘阵列卡冲突,跳过阵列卡自检直接进入系统,boom,就导致了这场悲剧 解决方法 在蓝屏的界面找到:疑难解答->通过命令提示符 使

Holo__的博客 3万+

CComPtr学习

这些天在弄有关的智能指针,因为其原理与通用的智能指针相似,但并不完全相同,故只是借鉴学习一下CComPtr,这是按照 msdn上学习的,可能在有的方法还不是理解太透,希望不会引起什么误解。CComPtr()这是一个构造函数,初始化成员变量,默认的构造函数是将P设为NULL,拷贝构造函数则是将p指向了LP并且通过P调用AddRef,然后在其析构时会通过P调用Release。Detach():这个函数

ITBUG的专栏 1236

光耦继电器电路分析

光耦电路的分析笔记

MingYue_SSS的博客 6888

服务器被矿工入侵记录

一次服务器被矿工入驻的处理记录

王瑞的技术专栏 1334

CComPtr和CComQIPtr

                                                                     CComPtr和CComQIPtr    CComPtr和CComQIPtr是智能接口指针类,它们在销毁的时候,不需要手动去释放接口指针,在赋值的时候,也不需要手动的AddRef,在出现异常的时候,会自动处理异常,而不需要额外的异常处理代码。    

tangaowen的专栏 1万+

隐藏技巧!用ArcGIS Pro像素编辑器实现PS级影像编辑(附地貌伪装案例)

本文深入探讨ArcGIS Pro像素编辑器的创意应用,从基础操作到高级影像处理实战,展示了其在城市规划、环境分析等领域的独特价值。通过详细的功能解析和地貌伪装等案例,帮助用户实现媲美专业图像处理软件的精细操作,提升GIS工作效率。

weixin_28520495的博客 336

ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)

一、智能指针的概念 智能指针是一个类,不是指针,智能指针在所包含的指针不再被使用时候会自动释放该所包含指针所占用的系统资源,而不用手动释放。 原理:智能指针封装了包含指针的AddRef()函数和Release()函数,且在该类不被需要的时候在析构函数里调用包含指针的Release()函数释放包含指针的资源。因此实质是利用类的析构达到调用包含指针的Release()函数的目的。 二、VC++中...

jiangqin115的专栏 736

YOLOv8全网首发:CVPR2026 MixerCSeg | DEGConv方向引导边缘门控,破解细长裂缝检测难题

DEGConv通过方向先验嵌入、边缘增强卷积和动态门控三大机制,针对性解决了YOLO在处理裂缝类细长、多方向、低对比度目标时的特征提取不足问题,显著提升了裂缝检测的精度与鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 518

AI Agent开发大全第一课-AI是什么以及如何使用AI

近年来,人工智能的迅猛发展引发了广泛的关注,尤其是“大模型”这一概念越来越深入人心。大模型,顾名思义,通常指的是那些拥有大量参数、能够处理复杂任务的机器学习模型。与传统小模型相比,大模型在数据处理、信息理解和生成等方面表现更加出色。为了理解为什么现在的AI被称为大模型,我们需要深入探讨几个关键因素。立角色是指在提示词中清晰地界定交互双方的身份。明确用户希望模型扮演的角色,可以帮助模型更准确地理解上下文和用户需求。

打造全国最全的AI Agent开发知识领域的博客 1406

有关CComPtr&CComQIPtr,CComBSTR,CComVariant,CAutoPtr的设计思想的分析

<br />这三种类型的封装类都对其封装类型进行包裹,尤其是提供分配内存以及释放内存。在设计思想上不同的是:<br />CComPtr<T>&CComQIPtr<T>:用于维护COM的接口,<br />l  对于构造函数和赋值等于,<br />n  无论传入T还是CComPtr<T>,都直接或间接AddRef(相当郁复制)并不是owner相应的T。也就是说通过构造函数或赋值等于传入的T还是由外部来owner释放。<br />不addRef直接owner T的办法只有两个:<br />l  使用Attach,

ljfth的专栏 999

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

引用计数我不怕之智能指针

前言 使用引记数,就算是再历害的高手也难免会出错。而一但出错了,之后再去查问题可就相当的困难了。正如我曾经看到,有一段代码是这样的: m_spView->Release();  m_spView->Release();  m_spView->Release(); 看到这段代码,就知道引用计数出问题了。他想通过这种方式,把多出来的计数Release掉。但这么做能解决问题吗?答案

fcryuuhou的专栏 1016

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【COM/ATL COM组件中的尝试用的智能指针 ATL库中的CComPtr和CComQIPtr】

CComQIPtr 模板类接受两个参数:一个是目标 COM 接口的类型,另一个是源 COM 接口的类型(即你已经有其指针的接口)。当你通过 CComQIPtr 访问一个接口时,它首先会尝试从源接口指针中查询目标接口。查询接口是 COM 中的一个重要概念,它允许一个 COM 对象暴露多个接口,而客户端可以通过查询接口来获取这些接口的指针。CComPtr 是一个模板类,它封装了一个指向 COM 接口的指针,并提供了自动引用计数(Reference Counting)和接口指针释放的功能。

一起学习进步! 793

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

内存碎片产生原因及解决方法

内存管理

songtaoyulu的博客 2090

关于 COM 指针·3则

最近在玩 MSHTML 和 MSXML,被一堆 COM 接口搞的晕头转向。以前也玩过一些,但基本都是照抄别人的代码,也没注意到 IDispatch * 和 IDispatchPtr 有啥区别,就模糊的认为可能是同一个东东的两种写法罢……这次趁机仔细研究了一番,转载3篇 COM 智能指针的详细的介绍,以备不时之需 ATL智能指针类 ATL中包含的智能指针包括:CAutoPtr、CAu

Perry 的专栏 2466

有效的使用和设计COM智能指针——条款12:必要时使用attach() 和 detach()调整引用计数

条款12:必要时使用attach() 和 detach()调整引用计数 更多条款请前往原文出处:http://blog.csdn.net/liuchang5 假设我们使用了一个第三方编写的函数,或者它也是由我们编写的,但仅仅是由于起初没有使用智能指针。于是它的实现可能是如

liuchang5的专栏 2371

使用CComPtr也要小心了

在用到Interface的时候,即使是用CComPtr,也不是高枕无忧的。如下面这段代码: IXMLDOMNode* CClass::GetNode(const CComBSTR &cbstrPath){    CComPtr  pNode;     /// 通过_pDoc取得了某个node    return pNode.Detach();} 外面接收

ITBUG的专栏 877

有效的使用和设计COM智能指针——条款4:理解ATL的CComPtr提倡简单,高效

条款4:理解ATL的CComPtr提倡简单,高效 更多条款请前往原文出处:http://blog.csdn.net/liuchang5 微软推出COM SDK后很快就意识到直接使用SDK开发COM是一件很困难的事情。于是他所做的第一件事情是将COM集成到MFC中去。但是随

liuchang5的专栏 6771

windows vs2022 MFC使用webview2嵌入网页

Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。WebView2 控件使用 Microsoft Edge 作为绘制引擎,以在本机应用中显示 web 内容。

sz76211822的专栏 3049

stl中使用智能指针的问题

1、stl中使用智能指针的问题存在安全性问题的根源:      看源码: template class CComPtr : public CComPtrBase ------------------------------------ template cla

klarclm的专栏 1931

ATL::CComPtr::operator& 断言 Expression: p == 0 原因分析

一、引言最近在开发过程中,在使用 ATL::CComPtr 的时候,总会出现一个断言提示:另外,在断言出现处点击“重试”,又可以定位到具体出错的地方://The assert on operator& usually indicates a bug. If this is really //what is needed, however, take the address of the p m

(ÒωÓױ) 1235
上一篇: 【CComPtr】CComPtr和CComQIPtr的区别
下一篇: Html 进行DOM 操作(放缩,颜色...),HTML抓图(放缩,滚动,拼接)
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值