17入精:CE:cpp std intro
13.5智能指针
13.5.1 raw指针和智能指针
- new运算符分配一块内存,可将这块内存的地址保存在一个指针变量

- 指针变量不但可以指向动态分配的内存,也可以指向一个自动变量:

- 一个T* 类型的指针变量可存储动态分配的内存地址,
- 也可以存储一个程序块的普通变量的地址。
- 这种指针称为raw指针(原始指针),因为除了内存地址外它没有存储别的东西。
- raw指针指向的动态分配内存应该及时释放,并且对new分配的内存要用delete释放
- new[]分配的内存要用 delete[]释放。
- 如果一个指针变量在指向新的内存时,没有释放原先指向的动态内存,就会造memory leaks
- 上述代码中p开始指向的是new分配的动态内存,然后修改p指向了变量i,而原先p指向的内存并没有用 delete释放,
- 这块动态内存就一直被程序占用,程序的其他部分或其他程序没法访问或释放这块内存,
- 造成内存泄漏。
- 如果用错了 delete也会造成内存汇漏
13.5.2 unique_ptr
- std::unique_ptr<>对象是对raw指针的包裏
- 将一个T*类型的动态分配内存块的raw指针
- 作为构造函数的参数就可以创建一个std:: unique_ptr<T>对象,
- 它退出其作用域销毁时,
- 析构函数自动释放其包含的raw指针指向的动态内存

我的天,那这个对象析构的时候他指向的东西也被释放了,我草!!
- std::unique_ptr<double>类对象p包裹动态分配的内存
- f()结束时,p被销毁,其析构函数会自动释放动态分配的内存。
- p和raw指针样,
- 用解引用运算符*(或间接访问运算符)访问p指向的动态内存
- 作为一个类对象,
- p可用unique_ptr<>类的成员函数。
- 用get()方法得到其包裹的raw指针:

- reset()将一个新的raw指针传递给它,原来的raw指针指向的内存被自动释放
