需求
希望使用智能指针,能够尽量减少内存泄漏
解决
智能指针比较适合在局部变量领域,在生命周期结束时,会自动释放。
定义
std::unique_ptr<QSerialPort> port_ = nullptr;
std::unique_ptr<int[]> buf_ = nullptr;
std::shared_ptr<int> data_ = nullptr;
std::weak_ptr<int> weak_ = nullptr;
赋值
port_ = make_unique<QSerialPort>();
// 未初始化
buf_ = make_unique<int[]>(new int[10]);
// 初始化为 0
buf_ = make_unique<int[]>(new int[10]());
buf_ = make_unique<int[]>(new int[10]{});
// shared
data_ = make_shared<int>();
// weak 必须绑定 shared
weak_ = data_;
使用
->
这个是调用指针指向的对象的相关操作.
这个是智能指针自身的一些操作- 直接使用
shared_ptr
指针有可能会产生循环引用的问题,导致死锁,无法释放。建议使用weak_ptr
来配合shared_ptr
. 注意weak_ptr
无法单独存在并使用。 weak_ptr
在使用的时候,需要通过lock
来获取shared_ptr
对象,如果相应的内存已经释放,那么会返回nullptr
, 可以通过这个判断内存是否有效。weak_ptr
本身不会增加shared_ptr
的引用次数。
释放
释放有好几种方法,最简单的就是第一种。
// 释放资源,置空指针
port_ = nullptr;
// 释放指针控制权,返回裸指针,置空指针
port_.release();
// 释放资源
port_.reset()
参考
std::make_unique, std::make_unique_for_overwrite
C++-创建“智能指针”函数01:make_unique【创建并返回unique_ptr至指定类型的对象】【定义在memory.h标准头文件中】【reset、release、get】
std::shared_ptr及std::unique_ptr使用数组注意事项
C++11智能指针 shared_ptr、weak_ptr和unique_ptr详解