野指针问题
什么是野指针
在c++中,使用指针是需要解引用去访问一块内存地址的。当一个指针变量指向的地址是非法地址时,就会出现野指针问题。一般我们在写代码的时候,会对指针变量有一个判空处理,但是对于野指针时,是不会被 ‘ ptr == nullptr ’ 中识别出来的。会导致在接下来的代码逻辑中,造成非法访问,异常,导致进程崩溃退出等等的问题。
野指针问题成因
野指针问题也是一个在实际代码工作中很常见的一个问题,也会不同的情况导致野指针问题出现:
- 指针变量的初始化,指针变量被定义后,没有正确初始化;
- 数据结构内存越界访问;
- 指针变量指向地址空间被释放后,指针变量没有置空。
内存泄漏
在C++中,因为内存管理是需要程序员自己控制的,那当程序员一些动态分配一些内存空间后,没有完成释放,就会造成内存泄漏问题。即这块内存虽然没有被我们所使用了, 但是依然处在一种被占用的状态,就像沙漏漏了一样无法使用。就是内存泄漏问题。
内存泄漏和野指针问题, 都是在写代码时,对内存的管理出现了疏漏,导致出现的问题。
同时,这种问题编译器是无法检查出来的,只有运行时才能发现,导致只有出现问题后才能去修,会让效率变低。
智能指针
智能指针时C++中想到一种自动管理内存的方法RAII。
大体思路是我们通过一个“智能指针类”,利用栈上的空间是自动回收的。在智能指针的构造函数中完成对堆上开辟空间的初始化,来避免一些野指针问题。在析构函数中,完成对被这个智能指针管理的堆上内存的释放。来避免一些内存泄漏问题。
最早的智能指针是在BOOST库中,
后来C++官方给了正式编制,
初期有auto_ptr,但是因为可能会有多个智能指针去保护同一片堆上内存空间的情况,这种时候就会导致同一片内存多次释放的问题。
所以在C++11中增加了
unique_ptr shared_ptr weak_ptr来解决了智能指针的一些安全问题。