C++Primer学习:智能指针与动态内存(2)
来源:互联网 发布:点对点数据专线 编辑:程序博客网 时间:2024/05/22 04:39
unique_ptr,它也是一种智能指针,但是某个时候只能有一个指向unique_ptr指向一个给定对象.
//定义并初始化
unique_ptr<int > p(new int(42));
p = nullptr;//释放p.release();//放弃对指针的控制,返回指针.但是不释放所指对象p.reset();//释放所指对象p.reset(q);//释放所指对象,提供内置指针q,并令p指向这个对象p.reset(nullptr);
weak_ptr是一种不控制对象生存周期的智能指针,它指向一个由shared_ptr管理的对象;当最后一个指向对象的shared_ptr被销毁,对象就会被释放,即时还有weak_ptr指向对象.它提供了reset(),lock(),expired()等成员函数来控制.
练习:定义一个StrBlob的伴随指针类:StrBlobPtr,它保存一个weak_ptr,指向StrBlob的data成员.通过使用weak_ptr,不会影响一个给定的StrBlob所指的vector的生存周期.它还保存了一个curr,用来保存当前所指对象的下标.此外,还在StrBlob中增加了begin(),end()成员用来返回一个指向它自己的StrBlobPtr类.
class StrBlobPtr;class StrBlob{ friend class StrBlobPtr;public: //构造函数 StrBlob() :data(std::make_shared<vector<string>>()) {};//默认初始化 StrBlob(initializer_list<string>il) : data(make_shared<vector<string>>(il)){}; size_t size()const { return data->size(); }; bool empty() const { return data->empty(); } void push_back(const string & s) { data->push_back(s); }; void pop_back() { check(0, "pop_back on empty StrBlob"); data->pop_back(); }; string & front(){ check(0, "front on empty strblob"); return data->front(); }; string & back(){ "back on empty strblob"; return data->back(); }; const string & front()const{ "front on empty strblob"; return data->front(); }; const string & back()const{ "back on empty strblob"; return data->back(); }; StrBlobPtr begin();//定义成员函数 StrBlobPtr end();//定义成员函数private: shared_ptr<vector<string>>data;//智能指针 void check(size_t , const string&)const;};void StrBlob:: check(size_t i, const string&msg)const{ if (i >= data->size()) throw out_of_range(msg);}class StrBlob;class StrBlobPtr{public: StrBlobPtr() :curr(0){}; StrBlobPtr(StrBlob & a, size_t sz = 0) :wptr(a.data), curr(sz){}; string & deref() const; StrBlobPtr& incr();private: weak_ptr<vector<string>> wptr; size_t curr;//定义下标 shared_ptr<vector<string>> check(size_t, const string&)const;};shared_ptr<vector<string>> StrBlobPtr::check(size_t i, const string& msg) const{ auto ret = wptr.lock(); if (!ret) throw::runtime_error("unbound StrBlobPtr");//未绑定的weak_ptr if (i >= ret->size()) throw::out_of_range("msg"); return ret;}string& StrBlobPtr::deref() const{ auto ret = check(curr, "deference past end"); return (*ret)[curr];}StrBlobPtr& StrBlobPtr::incr(){ check(curr, "increment past end of StrBolbPtr"); ++curr; return *this;}//定义StrBlob的成员函数begin(),end()StrBlobPtr StrBlob::begin(){ return StrBlobPtr(*this);}StrBlobPtr StrBlob::end(){ return StrBlobPtr(*this, data->size());}
0 0
- C++Primer学习:智能指针与动态内存(2)
- C++primer学习:智能指针与动态内存(1)
- C++Primer学习:动态内存与智能指针(3)
- 【足迹C++primer】39、动态内存与智能指针(2)
- 【足迹C++primer】39、动态内存与智能指针(1)
- 【足迹C++primer】39、动态内存与智能指针(3)
- C++ Primer 学习笔记——动态内存与智能指针(1)
- C++ Primer 学习笔记——动态内存和智能指针(2)
- c++ primer(第五版)学习笔记及习题答案代码版(第十二章)动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 动态内存与智能指针
- 通配符的匹配很全面, 但无法找到元素 'context:component-scan' 的声明。
- LINUX下通过C++访问SQLSERVER数据库
- Saving James Bond - Easy Version
- iOS8下的远程推送
- 人脸识别---排序测度特征(Ordinal Measures)
- C++Primer学习:智能指针与动态内存(2)
- 分支限界法vs回溯
- MFC 之 CButton 控件重绘(GDI篇)
- http://www.cnblogs.com/AloneSword/p/3821569.html
- java web项目,将服务器地址直接访问web项目的主页面
- 防止Block的循环引用 weakself strongself
- 一种基于浏览器内核修改的复杂网站layout/渲染bug的HTTP重放调试系统
- CodeChef 2015年10月问题
- IOS中Bitcode的