C++11学习笔记5---智能指针
2015-10-29 10:20
281 查看
1.为什么要使用动态内存
①程序不知道自己需要使用多少对象(比如容器)
②程序不知道所需对象的准确类型(比如不知道是基类还是其派生类)
③程序需要在多个对象间共享数据(共享数据就是说,不同拷贝之间是引用的是相同的元素。比如C++ Primer 5th p404的Blob类)
2.为什么要使用智能指针来管理内存
老的方式:new+delete会忘记释放造成泄露,或者过早释放造成空悬指针。
新的方式:shared_ptr+make_shared会为每个指针进行引用计数,当计数变为0时,自动释放内存。
注:①shared_ptr和make_shared都是模板类
②make_shared对应于老方式的new,为对象分配一个内存,然后返回指向该内存的指针。
③通常我们可以auto ptr = make_shared<T>(args),其中args是动态创建对象的初始值。
2015/11/30补充:
3.智能指针的初始化
(1)默认初始化为空指针nullptr
shared_ptr<int> p1;
这个时候p1就是默认初始化为nullptr
(2)make_shared<>
make_shared<>在尖括号里面的类型要与shared_ptr<>中的一致。
指向动态分配的内存。
①值初始化
shared_ptr<int> p2 = make_shared<int>();
这是p2指向0
②普通初始化
shared_ptr<int> p3 = make_shared<int>(42);
p3指向42
(3)new
因为接受指针参数的智能指针构造函数是explicit的,不接受类型转换。所以,我们不能将一个内置指针类型隐式转换为智能指针。
用new是必须使用直接初始化。
shared_ptr<int> p4(new int(1024)); //正确。
shared_ptr<int> p5 = new int(2048); //发生隐式转换,错误。
①程序不知道自己需要使用多少对象(比如容器)
②程序不知道所需对象的准确类型(比如不知道是基类还是其派生类)
③程序需要在多个对象间共享数据(共享数据就是说,不同拷贝之间是引用的是相同的元素。比如C++ Primer 5th p404的Blob类)
2.为什么要使用智能指针来管理内存
老的方式:new+delete会忘记释放造成泄露,或者过早释放造成空悬指针。
新的方式:shared_ptr+make_shared会为每个指针进行引用计数,当计数变为0时,自动释放内存。
注:①shared_ptr和make_shared都是模板类
②make_shared对应于老方式的new,为对象分配一个内存,然后返回指向该内存的指针。
③通常我们可以auto ptr = make_shared<T>(args),其中args是动态创建对象的初始值。
2015/11/30补充:
3.智能指针的初始化
(1)默认初始化为空指针nullptr
shared_ptr<int> p1;
这个时候p1就是默认初始化为nullptr
(2)make_shared<>
make_shared<>在尖括号里面的类型要与shared_ptr<>中的一致。
指向动态分配的内存。
①值初始化
shared_ptr<int> p2 = make_shared<int>();
这是p2指向0
②普通初始化
shared_ptr<int> p3 = make_shared<int>(42);
p3指向42
(3)new
因为接受指针参数的智能指针构造函数是explicit的,不接受类型转换。所以,我们不能将一个内置指针类型隐式转换为智能指针。
用new是必须使用直接初始化。
shared_ptr<int> p4(new int(1024)); //正确。
shared_ptr<int> p5 = new int(2048); //发生隐式转换,错误。
相关文章推荐
- C语言学习笔记一
- C++、C#、java算法学习日记01---冒泡排序(BubbleSort)
- C++中的volatile修饰符的作用
- c++文件读写
- 1037. 在霍格沃茨找零钱(20)
- exuberant ctags、ctags、ptags等标签工具介绍
- 消除C++中警告代码
- 在C语言中函数中使用枚举类型和结构
- c语言编程的乘法口诀表
- 用C语言输出一个菱形
- 猜数字游戏
- C++:IO缓冲区
- C++ switch语句(多选分支结构)
- C++动态链接库的两种调用方式
- 为什么多数游戏服务端是用 C++ 来写
- Data语意学 继承与Data Member
- 渣校ACM历程——路程之长春站
- 【C++】primer plus 练习7.5
- C++中虚析构函数的作用
- 【C++】primer plus 练习7.3