C++智能指针
(这只是在下的粗浅理解,不足的地方还请谅解,欢迎留言提出,后期理解深入后会加以改进)
为什么会有只智能指针:
由于C++没有自动的内存回收机制,每次new出来的内存都要手动delete,而有时候很容易会遗忘掉delete这一过程,因此会造成严重的后果
智能指针其实就是定义一个类,指向一块内存空间,在被异常打断时,智能指针声明周期结束,然后自动调用析构函数释放该空间,以保证不会发生内存泄漏。
常用的几种智能指针:
auto_ptr
std::auto_ptr可以用来管理单个对象的堆内存,当有两个指针指向同一个内存时,第一个指针将不会再指向该内存,相当于第一个指针将管理权交给了第二个指针,也就是说同时只能有一个指针指向该内存
注意:
1、尽量不要使用“operator=”
2、release()函数不会释放对象,仅仅是归还所有权
3、std::auto_ptr最好不要当成参数传递
4、最好不要使用该指针
scoped_ptr
scoped_ptr也可以同auto_ptr一样的正常使用,但是没有release()函数,所以不会导致内存泄漏的问题,其次scoped_ptr是独享所有权的,因此不会有auto_ptr的一些问题,是建议多使用的。
shared_ptr
shared_ptr可以很方便的使用,也没有release()函数,并且在其内部维护了一个引用指针,由此可以支持复制、参数传递等,其中提供的use_count(),此函数返回其内部的引用计数,也就是说该指针是专门用于共享所有权的。
weak_ptr
weak_ptr指针是专门为shared_ptr而准备的,在有的情况下,我们只需要关注使用对象,而不想改变其引用计数,则使用weak_ptr,它相当于shared_ptr的观测者,只会对其进行引用而不会改变其引用计数,当然在shared_ptr失效后,weak_ptr也会失效。
总结:
1、在可以使用boost库的情况下,就不要使用auto_ptr,容易出现错误
2、如果对象无需共享,则使用scoped_ptr
3、如果对象需要共享,则使用shared_ptr
4、如果需要访问shared_ptr对象,而又不要改变其引用计数的情况下,则使用weak_ptr,一般常用于软件 框架设计
5、如果使用了智能指针,则在代码中千万不要出现delete关键字
该文章借鉴