凡科做网站行吗wordpress建站镜像
news/
2025/10/1 23:59:40/
文章来源:
凡科做网站行吗,wordpress建站镜像,浙江建设培训考试网站,网站建设设计费用背景
谈起C#xff0c;它被公认为最难学的编程语言之一#xff0c;不仅语法知识点广泛#xff0c;细节内容之多#xff0c;学习难度和学习周期也长#xff0c;导致好多新入行的开发者对C“敬而远之”#xff0c;甚至“从入门到放弃”。自C11开始#xff0c;好多C程序员…背景
谈起C它被公认为最难学的编程语言之一不仅语法知识点广泛细节内容之多学习难度和学习周期也长导致好多新入行的开发者对C“敬而远之”甚至“从入门到放弃”。自C11开始好多C程序员慢慢的感受到了C的魅力所在似乎难度也越来越小。 本文要讲的是C11引入的智能指针之std::unique_ptr。
std::unique_ptr系C11引入的智能指针拥有资源的唯一所有权头文件 #include memory。
unique_ptr指针指向的堆内存空间的引用计数为 1如果unique_ptr 指针放弃对所指堆内存空间的所有权那么该空间会被立即释放回收。
那么什么时候使用unique_ptr呢简单来说可以考虑将动态分配的有唯一所有者的资源保存在unique_ptr的实例中。
如何初始化一个std::unique_ptr对象
方法一
std::unique_ptrint sp(new int(12345));
方法二
std::unique_ptrint sp;
sp.reset(new int(12345));
方法三
std::unique_ptrint sp std::make_uniqueint(12345);
以上三种方式均可其中方法三是C14新增的通过std::make_unique方法来创建std::unique_ptr对象。
std::unique_ptr禁止复制语义
和 std::shared_ptr区别unique_ptr是移动构造unique_ptr不可拷贝和赋值但可以被移动unique_ptr禁止复制语义拷贝构造函数和复制运算符operator 均被标记为 deleteshared_ptr是拷贝构造伪代码如下 std::unique_ptrT up1 std::move(up); std::shared_ptrT sp1 sp; unique_ptr 独占所指向的对象与shared_ptr不同的是某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时它所指向的对象也被销毁。
禁止复制语义存在特例比如可以通过函数得到一个std::unique_ptr对象然后返回给up即可
std::unique_ptrint clone(int val)
{std::unique_ptrint p(new int(val));return p;
}int main()
{int num 5;std::unique_ptrint up clone(num);return 0;
}
std::unique_ptr与std::move不解之缘
std::unique_ptr无法被复制但可以使用移动构造将std::unique_ptr对象持有的堆内存转移给另外一个对象简单代码如下
std::unique_ptrint sp(std::make_uniqueint(12345));std::unique_ptrint sp1(std::move(sp));
std::move将sp持有的堆内存转移给sp1后sp不再持有堆内存的引用变成一个空的智能指针对象。
那么是不是所有的对象都可以用std::move操作呢答案是否定的只有实现了移动构造函数或移动运算符的类才可以。恰恰std::unique_ptr实现了二者。
使用场景举例
动态申请的资源提供异常安全保障
当我们动态申请内存后可能会抛出异常或者提前退出导致没有执行delete操作。
#includememory
#includeiostream
using namespace std;class Func {};int main()
{Func* pFunc new Func;/可能抛出异常delete pFunc;return 0;
}
此时使用std::unique_ptr来管理动态内存只要std::unique_ptr指针创建成功其析构函数都会被调用确保动态资源被释放。
#include memory
#includeiostream
using namespace std;class Func{};int main()
{unique_ptrFunc upFunc(new Func);//...return 0;
}
容器内保存指针示例
std::vectorstd::unique_ptrint vec;
std::unique_ptrint sp(std::make_uniqueint(12345));
vec.push_back(std::move(sp));
篇幅有限本文权当抛砖引玉感兴趣的同学可基于此做进一步的拓展和探究。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924417.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!