一、share_ptr 的简单使用
1.1、基本用法
从较浅的层面看,智能指针是利用了一种叫做RAII(资源获取即初始化)的技术对普通的指针进行封装,这使得智能指针实质是一个对象,行为表现的却像一个指针。
智能指针的作用是防止忘记调用delete释放内存和程序异常的进入catch块忘记释放内存。另外指针的释放时机也是非常有考究的,多次释放同一个指针会造成程序崩溃,这些都可以通过智能指针来解决。
智能指针的行为类似于一个常规指针,与常规指针之间重要的区别就是它负责自动释放所管理的资源,share_ptr 使用引用计数,允许多个 share_ptr 指向同一资源,每多一个 share_ptr 指向该资源,share_ptr 的引用计数就 +1 ,减为0时表示没有 share_ptr 对该资源进行引用了,就会释放所指向的资源。share_ptr 内部中的引用计数是线程安全的,但是引用的资源不是线程安全的。
1.2、初始化
- 裸指针直接初始化,但不能通过隐式转换来构造,因为 share_ptr 构造函数被声明为 explicit
- 允许移动构造与拷贝构造
- 通过 make_share 构造
#include <iostream>
#include <memory>
class test {};
int main()
{
std::shared_ptr<test> f(new test()); // 裸指针直接初始化
//std::shared_ptr<test> f1 = new test(); // Error,explicit禁止隐式初始化
std::shared_ptr<test> f2(f); // 拷贝构造函数
std::shared_ptr<test> f3 = f; // 拷贝构造函数
f2 = f; // copy赋值运算符重载
std::cout << f3.use_count() << " " << f3.unique() << std::endl;
std::shared_ptr<test> f4(std::move(new test())); // 移动构造函数
//std::shared_ptr<test> f5 = std::move(new test()); // Error,explicit禁止隐式初始化
std::shared_ptr<test> f6(std::move(f4)); // 移动构造函数
std::shared_ptr<test> f7 = std::move(f6); // 移动构造函数
std::cout << f7.use_count() << " " << f7.unique() << std::endl;
std::shared_ptr<test[]> f8(new test[10]()); // Error,管理动态数组时,需要指定删除器
std::shared_ptr<test> f9(new test[10](), std::default_delete<test[]>());
auto f10 = std::make_shared<test>(); // std::make_shared来创建
return 0;
}

1万+

被折叠的 条评论
为什么被折叠?



