智能指针
- 使用普通指针管理堆内存时,容易因忘记释放造成堆内存泄漏、二次释放以及由于程序发生异常时内存泄漏等问题,因此C++引入智能指针auto_ptr来帮助管理的堆内存
- C++11摒弃了auto_ptr(只是一种建议,编译器并不禁止),并新增了三种智能指针:unique_ptr、shared_ptr和weak_ptr
- 智能指针对象管理内存的基本思想:将new获得的内存地址赋值为智能指针对象,当智能指针过期时,其析构函数将使用delete来释放内存
- 要定义智能指针,必须包含头文件
#include <memory>
auto_ptr<int> ptr1{
new int }; //正确的
auto_ptr<int> ptr2(new int); //正确的
auto_ptr<int> ptr2 = new int; //错误的,只能指针不允许隐式类型转换
auto_ptr
- auto_ptr是C++98就引入的智能指针,目前被C++11摒弃
- auto_ptr的基本用法:
class A
{
public:
A(){
cout<<"A()"<<endl;}
~A(){
cout<<"~A()"<<endl;}
int data;
};
auto_ptr<A> ptr(new A);
ptr->data = 10; //与普通指针类似使用->访问所指向的对象的成员
ptr.reset(new A); //会先释放已有的内存(调用~A())然后指向新的内存(调用A())
ptr.release(); //释放智能指针所指向的内存(调用~A()),智能指针内部的普通指针被置为空指针
A* ptr2 = ptr.get(); //返回智能指针对象所指向内存的地址
- auto_ptr的缺点:
int * ps = new int;
int * ps1 = ps;
(1)假如