智能指针shread_ptr

1、shared_ptr

  1、shared_ptr多个指针指向相同的对象。shared_ptr使用引用计数,每个shared_ptr的拷贝

都指向相同的能存。每次使用它一次,该对象内部的引用计数加1,指向该对象的shared_ptr指针

每减少一个,该对象内部的引用计数就减1,当引用计数为0时,就自动的删除该对象所指向的堆内

存(不可手动释放)。

   2、shared_ptr的初始化:

 

1     shared_ptr<int> ptr(new int(2));
2     auto ptr1(ptr);
3     shared_ptr<int> ptr2 = make_shared<int>(2);   //make_shared是标准库的函数
4     //auto ptr3 = make_shared<int>(ptr2);  //错误
5     //shared_ptr<int> ptr3 = new int(2);   //错误

 make_shared用其参数来构造给定类型的对象,如果我们不传递任何参数,对象就会进行初始化。

  shared_ptr自动销毁所管理的对象:

  当指向一个对象的最后一个shared_ptr被销毁时,shared_ptr类会自动销毁此对象,他是通过另一、

个特殊的成员函数—析构函数完成销毁工作的,类似于构造函数,梅格雷都有一个析构函数。shared_ptr

的析构函数会递减他说指向的对象的引用计数,如果引用计数变为0,shared_ptr的析构函数就会销毁对象,

并释放它所占用的内存。

  2、shared_ptr指针常用操作

(1)、use_count():返回返回多少个智能指针指向某个对象(该对象的引用计数);

(2)、unique():是否该智能指针独占某个指向的对象,也就是说若只有一个智能指针指向某个对象,则

unique()返回true,否则返回false;

(3)、reset():恢复(复位/重置)

  a)reset()不带参数

  若pi是唯一指向该对象的指针,那么释放该对象,同时将pi置空;

  

    shared_ptr<int> pi(new int(10));
    pi.reset();
    if (pi == NULL)
    {
        cout << "pi被置空!" << endl;
    }

 

  若pi不是唯一指向该对象的指针,那么不释放该对象,但指向该对象的引用计数会减少1,同时将pi置空;

  

    shared_ptr<int> p(new int(10));
    auto pi(p);           //此时p和pi的引用计数都为2
    pi.reset();           //此时p的引用计数变为1,同时pi被置空
    if (pi == NULL)
    {
        cout << "pi被置空!" << endl;
    }

  b)、若reset()带参数

  若pi是唯一指向该对象的指针,则释放该对象,让pi指向新的对象。

  若pi不是唯一指向该对象的指针,那么不释放该对象,但指向该对象的引用计数会减少1,同时让pi指向新对象;

posted @ 2020-05-12 09:09  StudyToAll  阅读(214)  评论(0编辑  收藏  举报