C++智能指针

来源:互联网 发布:js设置div背景图片 编辑:程序博客网 时间:2024/06/01 09:19

1、unique_ptr

     与所指对象内存绑定紧密不能与其他unique_ptr对象共享对象内存。
     所有权可以通过move()对其进行转让, 一旦转让,原有的指针失去了对内存的所有权

unique_ptr<int> up1(new int(11));

unique_ptr<int> up2 = up1;   //不能复制,编译报错,没有拷贝构造函数,但保留移动构造函数

 unique_ptr<int> up3 = move(up1);    //移动语义

2、shared_ptr

     采用引用计数,允许多个对象共享的拥有内存,有一个对象释放了只是引用计数降低了内存并没有释放, 只有引用计数变为0时才会释放内存。

shared_ptr<int> sp1(new int(12));
    shared_ptr<int> sp2 = sp1;        //共享内存
    std::cout << *sp1;           
    std::cout << *sp2;
    sp1.reset();                          //只是导致了引用计数的降低,不影响sp2的使用。
    std::cout << sp2;

3、 weak_ptr

//使用weak_ptr的成员lock,可返回指向shared_ptr指针指向对象的内存,却并不拥有此内存。

  weak_ptr<int> wp = sp1;   //指向shared_ptr<int>所指对象,但不拥有内存

如果堆空间时效, 则返回一个指针空值nullptr;
    

4、垃圾回收机制

1、基于引用计数的垃圾回收机制:
          当一个对象的引用计数变为0时,该对象即可视作“垃圾”而回收。

2、基于跟踪处理的垃圾回收机制:
          相对于引用计数,跟踪处理机制有更广泛的应用。其基本方法是产生跟踪对象关系图,然后进行垃圾回收。
         (1)标记-清除
                  这个算法分为两个过程。将当前使用对象作为根对象,从根对象查找他们的引用堆空间,并做标记。
                 标记完成的对象叫可达对象或活对象,没有标记的对象被认为是垃圾,第二部,将其回收清除。
                 特点是:对象不会移动,存在内存碎片
           (2)标记-整理
                标记完成后不清除,而是将活对象向左靠齐,这就解决了内存碎片的问题。
                特点是:移动活对象。所以程序中所有堆内存的引用都必须更新。
          (3)标记-拷贝 不多做解释了。

原创粉丝点击