C++11 智能指针——unique_ptr
来源:互联网 发布:程序员相亲被骗 编辑:程序博客网 时间:2024/05/01 23:28
//疑问:既然可以将unique_ptr<int>类型push到vector中,那该如何获取unique_ptr<int[]>的每个元素,//然后分别push到vector中呢?有知道方法的 朋友忘不吝指教,谢谢。2016-03-05***//2016-03-07 unique_ptr<int[]> uia;uia实际上是数组指针,而且uia[i]的返回是int类型的,除非使用new或malloc重新分配内存然后再使用uia[i]来初始化,否则没有办法将unique_ptr<int[]>所有的元素放到vector<unique_ptr<int> >中。而且push的时候需要使用move,而不能直接使用unique_ptr<int>对象。
- unique_ptr是C++11从boost中引进取代auto_ptr的智能指针。
- unique_ptr的原始指针对象被一个unique_ptr所独占,不可共享。
- unique_ptr不仅适用于new创建的单个对象,也适用于new[]创建的数组对象。
- unique_ptr不允许拷贝构造以及拷贝赋值(使用了 = delete显示的删除其拷贝构造与拷贝赋值函数),但可以使用reset来重置管理的原始指针。
- unique_ptr可以使用右值引用来返回一个unique_ptr或者使用std::move来转移一个unique_ptr的拥有权到另外一个unique_ptr。
- unique_ptr可以自定义删除器,可以在unique_ptr对象析构的时候调用指定的函数/仿函数(删除器具体使用见后续shared_ptr)
- unique_ptr适用于STL容器——虽然unique_ptr的拷贝构造与拷贝赋值函数被显示的delete了,但是unique_ptr支持move语意
unique_ptr的简单使用
#include <iostream>#include <memory>#include <algorithm>using namespace std;int main(){ /**< unique_ptr manager new >*/ unique_ptr<int> ui(new int(5)); unique_ptr<int> umi = make_unique<int>(5); unique_ptr<int> ui2 = ui; //WRONG: operator = has been delete from class unique_ptr unique_ptr<int> ui3 = move(ui); //OK,use std::move to transfer ownership,ui release it's ownership and transfer it to ui3 /**< unique_ptr manager new[] */ unique_ptr<int[]> uiarray(new int[10]); for(int i = 0;i < 10;) { //operator[](const int __i){return get()[__i];} //若原始指针是m_Mng,则unique_ptr<int[]>的[]操作实际上等效于*(m_Mng+i) uiarray[i] = i++; } for(int i = 0;i < 10;++i) { cout << "u[" << i << "] = " << uiarray[i] << " "; } /**< unique_ptr use in vector */ vector<unique_ptr<int> > vui; vui.push_back(ui); //错误:使用已经删除了的unique_ptr //error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp //std::default_delete<int>; std::unique_ptr<_Tp, _Dp> = std::unique_ptr<int>]' vui.push_back(move(ui3)); //OK,transfer ownership,set nullptr to ui3// for(int i = 0;i < 10;++i)// {// unique_ptr<int> uimv = move(uiarray[i]);//既然可以将unique_ptr<int>类型push到vector中,那该如何获取unique_ptr<int[]>的每个元素,然后分别push到vector中呢?// vui.push_back(uimv);// } /**< ~unique_ptr() will delete source you new/new[] before */ return 0;}
看过一些博客说unique_ptr不适用于数组,看了unique_ptr.h发现有对数组的支持,下面是一个unique_ptr数组使用的例子,运行结束时有将数组的所有元素都析构掉。
//Add 2016-03-07#include <memory>#include <iostream>using namespace std;class uniclass {private: int m_i;public: uniclass():m_i(0){} void operator = (const int i) { m_i = i; } ~uniclass() { cout << "destroty:" << m_i << endl; }};void test() { unique_ptr<uniclass[]> uia(new uniclass[10]); for (int i = 0; i < 10; ++i) { uia[i] = i + 1; }}int main(){ test(); while (1); return 0;}
0 0
- C++11 智能指针——unique_ptr
- c智能指针:unique_ptr
- C++11教程1 智能指针——unique_ptr
- C++11 智能指针unique_ptr
- 【C/C++】智能指针auto_ptr,share_ptr,unique_ptr
- 【C++】智能指针auto_ptr/unique_ptr/shared_ptr/weak_ptr!!!
- C++11智能指针之unique_ptr
- C++11智能指针之unique_ptr
- C++11引入智能指针std::unique_ptr
- C++ 11智能指针之unique_ptr
- C++11智能指针之unique_ptr
- C++ 11智能指针之unique_ptr
- C++11 智能指针 unique_ptr shared_ptr weak_ptr
- C++11智能指针之unique_ptr
- C++11智能指针之unique_ptr
- C++11智能指针之unique_ptr
- C++11智能指针之unique_ptr
- C++11智能指针之unique_ptr
- 【杭电】[1124]Factorial
- C++多态与可变参数混搭的奇妙之处
- 动态规划
- 检测链表环路引发的思考
- HPU OJ 序列找数
- C++11 智能指针——unique_ptr
- 258. Add Digits
- 单片机C语言 if与#if
- HDU3874 Necklace(树状数组)
- ch5优化
- BestCoder Round #74 (div.2) -LCP Array(有毒的模拟)
- Subsequence(尺取法)
- 数组旋转新方法
- Linux Mint 17.2 输入法安装