本文有些内容参考了相关博客,但是由于没有第一时间记录因此丢失了参考链接,有缘看到的博友可以提醒我一下我可以补上
0. 前言
0.1 使用智能指针的原因
- 资源释放,指针没有置空;
- 内存泄漏;
- 多次释放coredump
0.2 智能指针和普通指针的区别(什么是智能指针)
在于智能指针实际上是对普通指针加了一层封装机制,区别是它负责自动释放所指的对象,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期。
新增了三种智能指针:unique_ptr、shared_ptr和weak_ptr。所有新增的智能指针都能与STL容器和移动语义协同工作。能够处理内存泄漏问题和空悬指针问题。
智能指针负责自动释放所指的对象,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期。
指针类型 |
特定 |
std::auto_ptr |
被C++11弃用。auto指针存在的问题是,两个智能指针同时指向一块内存,就会两次释放同一块资源,自然报错。 |
std::unique_ptr |
(single ownership)unique指针规定一个智能指针独占一块内存资源。当两个智能指针同时指向一块内存,编译报错。 **实现原理:**将拷贝构造函数和赋值拷贝构造函数申明为private或protected。不允许拷贝构造函数和赋值操作符,但是支持移动构造函数,通过std:move把一个对象指针变成右值之后可以移动给另一个unique_ptr。 |
std::shared_ptr |
(shared ownership)多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。通过成员函数use_count()来查看资源的所有者个数。 |
std::weak_ptr |
(temp/no ownership)是对share_ptr的补充 |
智能指针的三个常用函数:
- get() 获取智能指针托管的指针地址
- release() 取消智能指针对动态内存的托管。析构对象。
- reset() 重置智能指针托管的内存地址。构造新对象,析构原对象。如果地址不一致,原来的会被析构掉
1. auto_ptr
(C++98的方案,C++11已经弃用) 采用所有权模式。
1.1 基本说明
// 头文件
#include <memory>
// 用法
auto_ptr<类型> 变量名(new 类型)
1.2 例子
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)