智能指针std::unique_ptr
std::unique_ptr
1.特性
1) 任意时刻unique_ptr只能指向某一个对象,指针销毁时,指向的对象也会被删除(通过内置删除器,通过调用析构函数实现删除对象)
2)禁止拷贝和赋值(底层实现拷贝构造函数和复制构造函数 = delete),可以使用std::move()、unique_ptr.reset(...) 转移对象指针控制权。
(由1决定,指针发生了拷贝就违反了第一条)
2.怎么实现禁止拷贝构造和赋值构造?
拷贝构造 和 赋值符‘=’ 对应函数 被删除了,所以用不了。 (看下面的构造函数表)
default (1) |
constexpr unique_ptr() noexcept;
|
---|---|
from null pointer (2) |
constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {}
|
from pointer (3) |
explicit unique_ptr (pointer p) noexcept;
|
from pointer + lvalue deleter (4) |
unique_ptr (pointer p,
typename conditional<is_reference<D>::value,D,const D&> del) noexcept;
|
from pointer + rvalue deleter (5) |
unique_ptr (pointer p,
typename remove_reference<D>::type&& del) noexcept;
|
move (6) |
unique_ptr (unique_ptr&& x) noexcept;
|
move-cast (7) |
template <class U, class E>
unique_ptr (unique_ptr<U,E>&& x) noexcept;
|
move from auto_ptr (8) |
template <class U>
unique_ptr (auto_ptr<U>&& x) noexcept;拷贝构造
|
拷贝构造 copy (deleted!) (9) |
unique_ptr (const unique_ptr&)= delete; |
复制作业(删除!)(4) |
unique_ptr&operator =(const unique_ptr&)= delete;
|
---|
可以在IDE/编辑器中查看详细实现:(下面是 GNU g++的实现)
我们可以看到,拷贝和赋值函数被禁止实现(禁用)了。
更加详细的内容参阅cppreference:
① std :: unique_ptr 构造
② 赋值
3. 使用
1 #include <iostream> 2 #include <memory> 3 using namespace std; 4 5 // unique_ptr::get vs unique_ptr::release 6 int main() 7 { 8 std::unique_ptr<int> foo; //foo - null 9 std::unique_ptr<int> bar; //bar - null 10 int* p = nullptr; 11 foo = std::unique_ptr<int>(new int(100));// foo - 100 12 bar = std::move(foo); // foo转移给bar bar - 100 foo - null 13 p = bar.get(); // p - 100 smart pointer.get()返回一个指向该对象的内置指针 14 foo.reset(bar.release()); // bar 放弃指针控制权,返回指针给foo foo - 100, bar已经不存在 15 16 cout << "foo : " << *foo << endl; 17 cout << "p : " << *p << endl; 18 delete p; //记得删除,这也是使用智能指针的初衷之一---防止内存泄漏!!! 19 20 if (bar) 21 cout << "bar : " << *bar << endl; 22 else 23 cout << "bar已经被释放" << endl; //这里bar已经销毁了,可能会报错。 24 25 return 0; 26 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述