Skip to content

异常

在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如:

  • 有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用;
  • 有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃);
  • 没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。

如何确保对象在抛出异常时也能被删除?什么是RAII?

总的思想是RAII:设计一个class,令他的构造函数和析构函数分别获取和释放资源。 有两个方法:

  • 利用“函数的局部对象无论函数以何种方式(包括因异常)结束都会被析构”这一特性,将“一定要释放的资源”放进局部对象的析构函数;
  • 使用智能指针。

如何避免内存泄漏

  • 使用智能指针。C++中的智能指针是一种特殊的指针,它可以自动管理分配的内存,在智能指针超出作用域时自动释放内存,因此可以避免内存泄漏。C++11标准引入了标准库中的unique_ptr和shared_ptr两种智能指针类型,程序员可以使用这两种智能指针来管理内存。
  • 使用RAII技术。RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种编程技术,它在对象构造时获取资源(例如内存),在对象析构时释放资源,从而避免内存泄漏。在C++中,程序员可以使用类的构造函数和析构函数来实现RAII技术。
  • 严格控制内存分配与释放。如果不能使用智能指针或RAII技术,则程序员应该认真跟踪内存分配与释放,并在适当的时候使用delete关键字释放内存。

吃好喝好 快乐地活下去