auto_ptr就是智能指针,它其实是一个类类型,定义在<memory>库中,具体定义可以看这篇:auto_ptr智能指针头文件
下面写段使用auto_ptr智能指针的代码,让大家更容易理解auto_ptr如何使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//========================================= // Author : 梁笔记 // Copyright : https://zouzhongliang.com //========================================= #include <iostream> #include <memory> using namespace std; class A { private: public: A(){ cout<<"构造A对象"<<endl; } ~A(){ cout<<"析构A对象"<<endl; } }; int main() { A* pa = new A(); cout<<"---------"<<endl; auto_ptr<A> Apa(new A()); return 0; } |
普通指针与auto_ptr智能指针使用比较结果:
1 2 3 4 |
构造A对象 --------- 构造A对象 析构A对象 |
可以看出用普通指针new的对象没有调用delete释放,就不会调用A类中的析构函数,从而造成内存泄漏。而用智能指针auto_ptr就不用调用delete,它自己离开作用域后会调用A类中的析构函数。
从上面代码大家看到了,通过auto_ptr智能指针让程序有了自动“垃圾回收”的功能。但其实不然,auto_ptr并没有哪么完美,它有以下几点局限性:
1.两个auto_prt指针不能指向同一个内存:
1 2 3 4 5 6 7 8 9 10 11 |
int main() { A* pa = new A(); cout<<"---------"<<endl; auto_ptr<A> Apa1(pa); auto_ptr<A> Apa2(pa); return 0; } |
1 2 3 4 |
构造A对象 --------- 析构A对象 析构A对象 |
看到结果析构了两次,其时只有一个对象pa,程序很可能会崩溃。
2.不要将auto_prt对象作为STL容器的元素,C++标准明确禁止这样做。
3.不能将数组作为auto_ptr的参数
1 2 3 4 5 6 7 8 9 10 |
int main() { A* pa = new A[5]; cout<<"---------"<<endl; auto_ptr<A> Apa1(pa); return 0; } |
1 2 3 4 5 6 7 |
构造A对象 构造A对象 构造A对象 构造A对象 构造A对象 --------- 析构A对象 |
可以看出给auto_ptr一个指针,它是无法判断出来它是否指向的是数组,只会认为是单个对象,而造成了只调用析构函数一次,造成内存泄漏。
注:auto_ptr智能指针控制的就是一个由new分配的单对象指针,并没有想像的哪么高级。
Truly loads of beneficial advice! Serevent And Advair Inhaler Coupons
Amazing all kinds of fantastic data. canadian pharmacies without an rx
Regards, I like this! pure cbd oil for sale
With thanks, Lots of posts.
cephalexin 500mg capsule antibiotic
Thanks a lot! I appreciate this! cialis generic
Truly a good deal of good material. global pharmacy canada
Seriously loads of valuable advice. cbd heroin addiction
Many thanks, Good information! mexican pharmacies shipping to usa