栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(3)c++智能指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(3)c++智能指针

一、shared_ptr

make_shared函数特点:
1)make_shared是一个模板函数;
2)make_shared模板的使用需要以**“显示模板实参”**的方式使用。
3)make_shared在传递参数格式是可变的,参数传递为生成类型的构造函数参数,因此在创建shared_ptr对象的过程中调用了类型T的某一个构造函数。

make_shared和shared_ptr的区别:

struct A;
std::shared_ptr p1 = std::make_shared();
std::shared_ptr p2(new A);

区别是:std::shared_ptr构造函数会执行两次内存申请,而std::make_shared则执行一次。

std::shared_ptr在实现的时候使用的refcount技术,因此内部会有一个计数器(控制块,用来管理数据)和一个指针,指向数据。
因此在执行std::shared_ptr p2(new A)的时候,首先会申请数据的内存,然后申请内控制块,因此是两次内存申请,而std::make_shared()则是只执行一次内存申请,将数据和控制块的申请放到一起。

二、weak_ptr(与shared_ptr配合使用)
#include
#include
using namespace std;

class B;
class A{
public:
        A(){cout<<"a()~"<cout<<"a good func"<cout<<"~A()"< ptrb;//ptrb对应的内存的引用不会加一
};

class B{
public:
         B(){cout<<"B()~"<cout<<"~B()"<cout<<"use A func:   ";
        shared_ptr ba=ptra.lock();//提升方法,该方法可应用于多线程
        if(ba !=NULL)
                ba->testA();
        }
        //shared_ptr ptra;//存在交叉引用风险
        weak_ptr ptra;//引用不会加一
};

int main()
{
        cout<<"begin"<
                shared_ptr pa(new A());
                shared_ptr pb(new B());
                cout<ptrb=pb;
                pb->ptra=pa;
                cout<testB();
        }

        cout<<"end"< 
三、unique_ptr 

一个unique_ptr "拥有"他所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定的对象。当unique_ptr被销毁时,它所指向的对象也被销毁。uniptr_ptr表达的是一种"独占"的思想。

虽然我们不能拷贝赋值unique_ptr,但是可以通过调用release或者set将指针的所有权从一个(非const)unique_ptr转移给一个unique:

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号