c++智能指针

1.shared_ptr

使用引用计数的方法管理动态内存。

1.1常用操作

// 空的share_ptr
shared_ptr<T> sp;
// 用 shared_ptr 方法构造
shared_ptr<T> sp(make_shared<T>(args));
shared_ptr<T> sp1 = sp2;
// 用内置指针构造。此构造函数是 explicit 的
shared_ptr<T> sp(q);
// 释放时用可调用对象d代替delete
shared_ptr<T, d> sp(q, d);
// 赋值。递减sp1的引用计数(变为0则释放),递增sp2的引用计数
sp1 = sp2;

// 返回内置指针
sp.get();
// 交换保存对象
swap(sp1, sp2);
sp1.swap(sp2);
// 引用计数是否为1
sp.unique();
// 返回引用计数。慢,用于调试
sp.use_count();

// reset系列方法放弃管理原对象(引用计数递减)
sp.reset();
// sp接管内置指针
sp.reset(q);
// 用可调用对象d代替delete
sp.reset(q, d);

1.2神奇功能

shared_ptr在构造时捕获了管理对象的析构行为,所以会发生下列情况。
例1:

#include <iostream>
#include <memory>
using namespace std;

class CBase
{
public:
    CBase() {};
    // 注意并没有虚析构
    ~CBase() {
        cout << "~CBase()" << endl;
    };
};

class CDerive : public CBase
{
public:
    CDerive() {};
    ~CDerive() {
        cout << "~CDerive()" << endl;
    };
};

int main(int argc, char* argv[])
{
    shared_ptr<CBase> sp(new CDerive());
    return 0;
}

输出:

~CDerive()
~CBase()

例2:

#include <iostream>
#include <memory>
using namespace std;

class CObj
{
public:
    CObj() {};
    ~CObj() {
        cout << "~CObj()" << endl;
    };
};

int main(int argc, char* argv[])
{
    shared_ptr<void> sp(new CObj());
    return 0;
}

输出:

~CObj()

我对于以上行为的理解参考了:https://www.cnblogs.com/Solstice/archive/2013/01/28/2879366.html

2.weak_ptr

一种“弱共享”对象的方法。如果shared_ptr相当于铁丝,那么weak_ptr相当于棉线。

2.1常用操作

// 空的weak_ptr
weak_ptr<T> w;
// p可以是weak_ptr或shared_ptr
weak_ptr<T> w(p);
w = p;

// 尝试将weak_ptr提升为shared_ptr(线程安全)
w.lock();
// 将w置空
w.reset();
// 是否过期(w.use_count()是否为0)
w.expired();
// 与w共享对象的share_ptr的数量
w.use_count();

3.unique_ptr

“独占”指向的对象。由于是独占对象,unique_ptr不支持拷贝构造。

3.1常用操作

// 空的unique_ptr
unique_ptr<T> up;
// 使用类型为D的可调用对象释放指针
unique_ptr<T, D> up;
// 用内置指针构造
unique_ptr<T> up(q);
// 用可调用对象d代替delete
unique_ptr<T, D> up(d);

// 获取内置指针
up.get();
// 交换保存对象
swap(up1, up2);
up1.swap(up2);
// 放弃对象控制权,返回原始指针并将up置空
up.release()

// reset系列方法释放原对象
up.reset();
// up接管内置指针q
up.reset(q);

原文链接: https://www.cnblogs.com/bwzdxl/p/12770395.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    c++智能指针

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/344132

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午2:31
下一篇 2023年3月2日 上午2:31

相关推荐