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); //发生隐式转换,错误。