C++ _com_ptr_t类

C++不自带内存回收机制,可能导致内存泄漏。本文聚焦于_Ccom_ptr_t智能指针,它能自动管理COM接口的AddRef和Release,避免此类问题。文章介绍了_Ccom_ptr_t的用途,对比了ATL中的CComPtr,并通过示例说明如何使用_COM_SMARTPTR_TYPEDEF宏创建接口智能指针。此外,还提醒读者注意文档记录的重要性。
摘要由CSDN通过智能技术生成

C++没有类似Java的内存回收机制,每执行一次new,就要手动delete。但是这容易产生很多问题。例如:

string* str=new string("...");

something.....//如果此处的代码出现了异常,导致程序终止。那么delete str便不会被执行。导致内存泄漏。

delete str;

如上例所示,实际编程种有很多种情况容易导致内存泄漏,这种情况并不少见。

可避免此问题的一种方法是使用智能指针。

本文主要介绍 _com_ptr_t 的使用。其实我们看名称就可猜出一二,这是一个模板类,其对象封装COM接口指针。

COM调用,需要手动AddRef,手动Release,大量的对象调用就要重复地执行AddRef,Release操作,容易出问题,写多了还烦人。

_com_ptr_t 是vc运行库中提供的固有的封装COM接口的智能指针,此模板类通过自动调用IUnknown成员函数: QueryInterface, AddRef,和Release来管理资源分配和解除分配。

说到封装COM接口指针的类,还有一个,是ATL种的CComPtr和CComQIPtr,此二者都是模板类,皆用来封装管理COM接口指针。笔者是C++小白,在这里吃了许多亏,一开始懵懵懂懂,稀里糊涂地就在自己的程序中用了CComPtr,后来发现无法在创建CComPtr对象中互相赋值,找到官方文档才知道,如果不是ATL工程,需要用_com_ptr_t而不是CComPtr来管理指针。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
unique_ptr是一种智能指针,它提供了一种简单的方式来管理动态分配的资源。它的主要特点是:当unique_ptr被销毁时,它所管理的资源也会被自动释放,从而避免了内存泄漏。 以下是一个简单的unique_ptr实现: ```c++ template <typename T> class unique_ptr { public: unique_ptr() : ptr_(nullptr) {} explicit unique_ptr(T* ptr) : ptr_(ptr) {} unique_ptr(const unique_ptr&) = delete; unique_ptr& operator=(const unique_ptr&) = delete; ~unique_ptr() { delete ptr_; } T* operator->() const { return ptr_; } T& operator*() const { return *ptr_; } T* get() const { return ptr_; } void reset(T* ptr = nullptr) { delete ptr_; ptr_ = ptr; } private: T* ptr_; }; ``` 使用示例: ```c++ unique_ptr<int> p(new int(10)); cout << *p << endl; p.reset(new int(20)); cout << *p << endl; ``` 这个实现中,我们使用了模板,使得unique_ptr可以管理各种型的资源。在构造函数中,我们通过一个指针来初始化unique_ptr对象,这个指针所指向的资源就成了unique_ptr所管理的资源。我们重载了成员访问运算符->和解引用运算符*,使unique_ptr可以像指针一样访问所管理的资源。get()函数返回unique_ptr所管理的指针。reset()函数可以用来重置unique_ptr对象,它会先释放原来的资源,然后再接管新的资源。 需要注意的是,在这个实现中,我们禁用了复制构造函数和赋值运算符,这是为了防止unique_ptr对象被复制,从而导致同一份资源被多个unique_ptr对象管理的情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值