在C++中使用智能指针能有效避免空指针和悬垂指针出现,使用智能指针也能减少心智负担。下面将讲解一下std::unique_ptr
智能指针。该智能指针用于处理只有一个实例拥有所有权的情况,可以通过所有权转移的方式移交资源。下面看一下它的使用方法:
#include <iostream>
#include <memory>
#include <cassert>
class Any {
public:
friend std::ostream &operator<<(std::ostream &out, const Any &a);
};
std::ostream &operator<<(std::ostream &out, const Any &a) {
out << "I am Any";
return out;
}
int main(void) {
std::unique_ptr<Any> a{new Any};
std::cout << *a << std::endl;
std::unique_ptr<Any> a2; // 初始化为nullptr
// a2 = a; // 非法,不允许左值赋值
a2 = std::move(a);
assert(a == nullptr);
assert(a2 != nullptr);
// C++14 可以使用 make_unique函数
auto a3 = std::make_unique<Any>();
std::cout << *a3 << std::endl;
// 创建一个包含实例的数组
auto a4 = std::make_unique<Any[]>(2);
std::cout << a4[0] << std::endl;
std::cout << a4[1] << std::endl;
return 0;
}
默认使用new
和delete
来分配和释放内存,也可以修改该行为。下面看一个例子:
template <typename T> auto dealloc = [](T *p) { free(p); };
int main(void) {
int *p = (int *)malloc(sizeof(int));
*p = 1;
std::unique_ptr<int, decltype(dealloc<int>)> ptr{p, dealloc<int>};
std::cout << *ptr << std::endl; // 输出: 1
}
常用方法:
- release():返回该对象的管理的指针,同时释放所有权。
- reset():释放管理的内存,同时也可以传递一个新对象的指针对象
- swap():交换所管理的对象。
- get():返回对象管理的指针。
- get_deleter():返回析构其管理对象调用的指针。