智能指针的理解
C++中的动态内存管理通过 new delete运算符来完成的:
new:在动态内存中为对象分配空间并且返回一个指向该对象的指针,可对对象进行初始化;
delete:接受一个动态对象的指针,销毁该对象,并释放与之关联的内存。
首先说一下为什么使用智能指针,存在以下几种情形:
- 申请的空间在使用完 甚至程序结束时忘记释放,这会造成了内存泄露;
- 有时在尚有指针引用内存的情况下 内存就被释放了,这会产生非法内存的指针(野指针);
现有的智能指针有:auto_ptr、shared_ptr、weak_ptr、unique_ptr,其中第一个auto_ptr已被c++11弃用,后三个是c++11新支持的。
使用智能指针很大程度上可以避免上面的问题,因为智能指针就是一个类,当超过了类的作用域,类会自动调用析构函数,析构函数会自动释放资源。使用智能指针需要添加头文件memory。
auto_ptr
c++98方案,c++11已经弃用,但是这里还是要讲一下:
auto_ptr采用所有权模式:
auto_ptr< string> p1 (new string ("I reigned lonely as a cloud.”));
auto_ptr<string> p2;
p2 = p1; //auto_ptr不会报错.
此时不会报错,p2剥夺了p1的所有权,但是当程序运行时访问p1将会报错。
所以auto_ptr的缺点是:存在潜在的内存崩溃问题!
unique_ptr
unique_ptr 替换了auto_ptr,同样采用了所有权模式。
unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。它对于避免资源泄露(例如“以new创建对象后因为发生异常而忘记调用delete”)特别有用。
unique_ptr<string> p3 (new string ("auto"));
unique_ptr<string> p4;
p4 = p3;//此时会报错!!
编译器