【足迹C++primer】39、动态内存与智能指针(1)
2014-07-06 14:40
232 查看
动态内存与智能指针(1)
还有一个weak_ptr的伴随类,定义在memory头文件中
由于p是use_factory的局部变量,在use_factory结束时它将被销毁。当p被销毁的时候,将递减其计数并检查它是否
为0.这个里面p是唯一引用factory返回内存的对象。由于p将要销毁,p指向的这个对象也会被销毁,所占用的内存会
被释放。
PS:好吧,谈一谈去做暑假工的感受,首先去的地方是东莞,嘿嘿,没错就是男人天堂--东莞。找事到时很容易,花了一个早上就找到了一家看起来还可以的,包吃住,宿舍都独立的卫生间,于是很开心的进去了,谁知道他们工资是计件的,我去你个大头娃娃,我个新手去做,一天按计件的话能赚几毛钱啊,月底估计就是拿个保底工资了,第一天我还搞坏了几个成品,直接扣工资,
说多了都是泪,最后决定坚决不干了,回家,于是我回来了。。。。
shared_ptr类
有两种特殊指针,shared_ptr和unique_ptr,前面那个支持多个指针指向同一个对象,后面那个则独占所指向的对象。还有一个weak_ptr的伴随类,定义在memory头文件中
make_shared函数
//指向一个值为42的int的shared_ptr shared_ptr<int> p3=make_shared<int>(42); //p4指向一个值为"9999999"的string shared_ptr<string> p4=make_shared<string>(10, '9'); //p5指向一个值初始化的int,即值为0 shared_ptr<int> p5=make_shared<int>(); //p6指向一个动态分配的空vector<string> auto p6=make_shared<vector<string>>();
...shared_ptr可以自动释放相关联的内存
//shared_ptr自动销毁所管理的对象。。。 //factory返回一个shared_ptr,指向一个动态分配的对象 typedef int T; struct Foo { // members are public by default Foo(T t): val(t) { } T val; }; shared_ptr<Foo> factory(T arg) { //恰当地处理arg //shared_ptr负责释放内存 return make_shared<Foo>(arg); } void use_factory(T arg) { shared_ptr<Foo> p=factory(arg); //使用p }//p离开了作用域,但它指向的内存不会被释放掉
由于p是use_factory的局部变量,在use_factory结束时它将被销毁。当p被销毁的时候,将递减其计数并检查它是否
为0.这个里面p是唯一引用factory返回内存的对象。由于p将要销毁,p指向的这个对象也会被销毁,所占用的内存会
被释放。
定义一个StrBlob类
//定义StrBlob类 class StrBlob { public: typedef vector<string>::size_type size_type; StrBlob(); //默认构造函数 StrBlob(initializer_list<string> il); //类型已知,数量未知的参数 size_type size() const {return data->size();} //这个{}里面的size()是vector自己的成员函数操作 bool empty() const {return empty();} //这个{}里面的empty()是vector自己的成员函数操作 //添加和删除元素 void push_back(const string &t) {data->push_back(t);} void pop_back(); //元素访问 string& front(); string& back(); private: shared_ptr<vector<string>> data; //如果data[i]不合法,抛出一个异常 void check(size_type i, const string &msg) const; }; //StrBlob构造函数 StrBlob::StrBlob():data(make_shared<vector<string>>()) {} StrBlob::StrBlob(initializer_list<string> il): data(make_shared<vector<string>>(il)) {} //元素访问成员函数 void StrBlob::check(size_type i, const string &msg) const { if(i >= data->size()) throw out_of_range(msg); } //pop_back和元素访问成员函数首先调用check。如果check成功,这些成员函数继续利用 //底层vector的操作来完成自己的工作: string& StrBlob::front() { //如果vector为空,check会抛出一个异常 check(0, "front on empty StrBlob"); return data->front(); } string& StrBlob::back() { check(0, "back on empty StrBlob"); return data->back(); } void StrBlob::pop_back() { check(0, "pop_back on empty StrBlob"); data->pop_back(); }
PS:好吧,谈一谈去做暑假工的感受,首先去的地方是东莞,嘿嘿,没错就是男人天堂--东莞。找事到时很容易,花了一个早上就找到了一家看起来还可以的,包吃住,宿舍都独立的卫生间,于是很开心的进去了,谁知道他们工资是计件的,我去你个大头娃娃,我个新手去做,一天按计件的话能赚几毛钱啊,月底估计就是拿个保底工资了,第一天我还搞坏了几个成品,直接扣工资,
说多了都是泪,最后决定坚决不干了,回家,于是我回来了。。。。
相关文章推荐
- 【足迹C++primer】39、动态内存与智能指针(2)
- 【足迹C++primer】39、动态内存与智能指针(3)
- 【足迹C++primer】39、动态内存与智能指针(3)
- C++Primer新笔记之----第12章 动态内存与智能指针
- C++primer学习:智能指针与动态内存(1)
- C++Primer学习:智能指针与动态内存(2)
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 用StrBlob代替vector<string> C++Primer 练习12.32
- C++primer学习笔记----智能指针
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- C++Primer中 智能指针一例分析
- 【C++ Primer 第5版 笔记】第12章 动态内存与智能指针
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 用StrBlob代替vector<string> C++Primer 练习12.32
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- 动态内存与智能指针