C++ 智能指针

你的名字 2022-08-20 02:23 356阅读 0赞

C++ 智能指针

为了更安全地使用动态对象,标准库定义了两个只能指针类型来管理动态分配的对象当一个对象应该被释放时,指向它的智能指针可以确保自动地把它释放。
理论上来说,一共有三个类型:

shared_ptr
unique_ptr
weak_ptr

本文主要介绍shared_ptrweak_ptr


简介

shared_ptr允许多个指针指向同一个对象。
unique_ptr则“独占”所指向的对象。
weak_ptr是一个弱引用,指向由shared_ptr管理的对象,但是不改变引用计数


shared_ptr

首先要介绍make_shared()函数,顾名思义就是在动态内存中分配一个对象,并返回shared_ptr,说白了就是让一段动态内存让shared_ptr去管理,使用的时候对特定类型构造时必须与其构造函数相匹配,例如:

  1. shared_ptr<int> p = make_shared<int>(1);

shared_ptr允许多个指针指向同一个对象,并且还有一个与之关联的引用计数,当拷贝shared_ptr时这个计数器会增加,书中提到两点:

参数传递
函数值返回

函数值返回很好理解,参数传递是指在函数调用时实参到形参的值传递时的一个拷贝,这样,在函数内部,引用计数+1,当函数调用完成后(局部变量自动销毁),引用计数减1。

使用shared_ptr管理内存十分有用,我们通常使用newdelete进行动态内存管理,但是如果出现下述情况:

  1. int *p=new int(4);
  2. //do something
  3. //exception
  4. delete p;

正如上述代码,如果在delete之前发生异常并且没有被捕获,那么这块内存就永远不会被释放了。而使用shared_ptr就不会出现这些问题,因为当与由智能指针管理的对象相关的计数器为0时,原本指向的对象就会自动被释放。


weak_ptr

指向由shared_ptr管理的对象,与shared_ptr共享不同,weak_ptr只是一个弱引用,他不改变与对象相关的引用计数,通过单步调试可以清楚看见:

  1. auto r = make_shared<int>(42);
  2. weak_ptr<int>wp = r;
  3. shared_ptr<int> p = make_shared<int>();
  4. r = p;

如下图:

这里写图片描述
一开始r指针的强引用(strong refs)和弱引用(weak refs)都是1,而p与r独立。

这里写图片描述
而当将p赋值给r之后,r指向了p所管理的内存,而自己原先管理的内存被释放掉,由于 weak_ptr不改变引用计数只起一个监控的作用,此时其状态已经变成了 expired,书中也称作 伴随指针


这里weak_ptr主要的两个函数:

expired()
lock()

我们知道weak_ptr指向由shared_ptr管理的内存,那么当引用计数变为0时(此时根据shared_ptr的机制会自动释放管理的内存),weak_ptr就会呈现expired状态,即expired() 返回true。

  1. std::shared_ptr<int> shared(new int(10));
  2. std::weak_ptr<int> weak(shared);
  3. std::cout << "1. weak " << (weak.expired() ? "is" : "is not") << " expired\n";
  4. shared.reset();
  5. std::cout << "2. weak " << (weak.expired() ? "is" : "is not") << " expired\n";
  6. system("pause");
  7. return 0;

运行结果:

这里写图片描述
而对于 lock()函数来说,如果 expired()为true,则返回一个空的 shared_ptr,否则返回一个指向该 weak_ptr所指向的对象的 shared_ptr


参考:

http://www.cplusplus.com/reference/memory/weak_ptr/expired/
http://blog.csdn.net/zhangxiao93/article/details/50570531

发表评论

表情:
评论列表 (有 0 条评论,356人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ 智能指针

    C++ 智能指针 为了更安全地使用动态对象,标准库定义了两个只能指针类型来管理动态分配的对象当一个对象应该被释放时,指向它的智能指针可以确保自动地把它释放。 理论上来

    相关 C++】智能指针

    在C++中,我们经常会用到动态开辟内存,需要我们自己维护,在出函数作用域之前,必须将管理的内存释放掉,否则就会造成内存泄漏,即使我们十分小心,但总有可能出错,因此便有了智能指针

    相关 C++智能指针

    1.智能指针的作用        C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说