需求

希望使用智能指针,能够尽量减少内存泄漏

解决

智能指针比较适合在局部变量领域,在生命周期结束时,会自动释放。

定义

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()

参考

为何优先选用unique_ptr而不是裸指针?

C++主动释放unique_ptr

现代 C++:一文读懂智能指针

C++ 智能指针 unique_ptr 详解与示例

std::make_unique, std::make_unique_for_overwrite

智能指针make_unique初始化数组的3种方法

C++智能指针如何指向数组

C++ make_shared智能指针的使用

C++-创建“智能指针”函数01:make_unique【创建并返回unique_ptr至指定类型的对象】【定义在memory.h标准头文件中】【reset、release、get】

std::shared_ptr及std::unique_ptr使用数组注意事项

std::unique_ptr release的使用

C++11智能指针 shared_ptr、weak_ptr和unique_ptr详解

share_ptr与weak_ptr的区别与联系

C++:共享指针shared_ptr的理解与应用

std::shared_ptr作为函数形参,通过值传递、引用传递的问题解答

C++11 shared_ptr智能指针(超级详细)