1.定义
在c++ 中智能指针是一种封装了原始指针的类 , 它用来自动管理动态分配的内存,以帮助避免内存泄漏和其他与原始指针相关的问题 。
c++11标准库提供的主要类型指针有: std::shared_ptr 和 std:: unique_ptr
2. std::shared_ptr
std::shared_ptr 是一个共享所有权的智能指针 , 多个shared_ptr 可以指向相同的资源 ,shared_ptr使用引用计数来跟踪有多少个 shared_ptr 指向同一个资源, 当最后一个指向该资源的 shared_ptr 被销毁时, 资源会被释放 。
用途: 适用于 资源有多个所有者的场景
特点: 可以被复制和移动 , 2. 使用引用计数来管理资源
2.1 例子
#include <iostream>
#include<memory>
using namespace std;
class BOX
{
public:
BOX()
{
cout << "BOX build" << endl;
}
~BOX()
{
cout << "BOX destructed" << endl;
}
void build()
{
cout << "build 3 BOX" << endl;
}
};
int main()
{
{
shared_ptr<BOX> boxptr1 = make_shared<BOX>();
cout << "the number of shared_ptr is ::" << boxptr1.use_count() << endl;
shared_ptr<BOX> boxptr2 = boxptr1;
boxptr2->build();
cout << "the number of shared_ptr is ::" << boxptr2.use_count() << endl;
}
return 0;
}
2.2 注意
1. 假如说某个函数只能接受裸指针
Ball* rp = p.get(); 调用shared_ptr 的get()函数来获取一个裸指针指向当前的资源
2. 如果你一个一块资源,同时有裸指针和共享指针同时指向它
当所有的共享指针都被摧毁时 但是裸指针仍然存在的时候,这个底下的资源仍然就会被释放,
这个时候再用裸指针访问那块资源的时候,会造成未定义,造成严重的后果
切记共享指针和裸指针混合使用!
3.std::unique_ptr
std::unique_ptr 是一种独占所有权的智能指针,它保证同一时间只有一个 ,std::unique_ptr
指向一个给定的资源。当这个unique_ptr
被销毁时(例如,离开作用域或者被显式删除),它指向的对象也会被自动删除。
用途:用于资源只需要一个所有者的场景
特点: 不能被复制,但可以移动(使用std::move) , 轻量级的,没有引用计数的开销