您的位置:首页 > 编程语言 > C语言/C++

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); //发生隐式转换,错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: