是一种智能指针(本身就是一个对象),指向一个对象。它能够记录多少个 shared_ptr 共同指向一个对象,从而消除显示的调用 delete,当引用计数变为零的时候就会将对象自动删除。
std::shared_ptr 可以通过 get() 方法来获取原始指针,通过 reset() 来减少一个引用计数, 并通过use_count()来查看一个对象的引用计数。
- //创建了一个 40字节内存空间 的对象,pointer 指向这个对象
- std::shared_ptr pointer = new int(10);
- std::shared_ptr pointer2 = pointer; // pointer2 也指向这个对象,且引用计数+1
-
- int *p = pointer.get(); // 这样不会增加引用计数
- std::cout << "pointer.use_count() = " << pointer.use_count() << std::endl; // 3
- std::cout << "pointer2.use_count() = " << pointer2.use_count() << std::endl; // 3
-
-
- //创建一个指针ptrB 栈对象,构造函数中没有任何参数,因此默认指向的是null。
- std::shared_ptr<int> ptrB();
-
- //这种写法也可以,{}表示赋初值或者说初始化,其它类型变量定义也是如此,是c++11的语法特性
- std::shared_ptr<int> ptrB{std::make_shared<int>(5)};
注意:std::make_shared
不支持数组。
主要功能是在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。
- //p1指向一个值为"9999999999"的string对象
- shared_ptr
p1 = make_shared(10, '9'); -
- //p2指向一个值为"hello"的string对象
- shared_ptr
p2 = make_shared("hello"); -
- //p2指向一个为空的string对象
- shared_ptr
p3 = make_shared(); -
- //这种写法也可以,{}表示赋初值或者说初始化,其它类型变量定义也是如此,是c++11的语法特性
- std::shared_ptr<int> ptrB{std::make_shared<int>(5)};
-
和上面直接使用 new
看下面两张图:内存分配可以一次性完成. 这减少了内存分配的次数, 而内存分配是代价很高的操作.
参考文章:
std::shared_ptr的使用_lyshiba的博客-CSDN博客_shared_ptr使用
std::make_shared_zhgeliang的博客-CSDN博客_std::make_shared