最常见的内存/资源泄漏错误

Art*_*yom 5 c++ memory-leaks

所有优秀的C++程序员都知道如何避免泄漏内存(或套接字等资源):

  1. 总是使用智能指针,i.e.:std::auto_ptr, boost::shared_ptr.
  2. 始终注意对象的所有权:谁拥有,谁引用,谁负责等.

但是,内存泄漏仍然会发生.当您在程序中发现内存泄漏时,即使您使用上述技术,也要指出最常见的问题.

我开始:

有时您忘记将基类的析构函数定义为虚拟.所以派生类引用的所有派生类都没有被正确销毁并因此泄露.

Sam*_*ell 5

除了泄漏之外,还有更多类型的错误.按从最坏到最好的顺序:

内存损坏.

数据存储在不应该存在的区域.这导致了大多数安全问题,并且是迄今为止最难追查的问题.

  • "随机位置"腐败
    • 数据存储在用户可以控制的存储位置.
    • 数据存储到数组而不检查索引.
    • 派生自的类型的对象X被存储到为基本类型保留的数组元素X,并且其大小X大于其基数的大小.
  • 终身腐败
    • 释放后,数据将存储到内存位置.
    • 使用了错误的释放方法(不匹配导致new/ free,malloc/ delete)
    • delete或者free在同一个指针上调用两次.

无法释放内存

程序不再使用的内存仍然分配.

  • 使用了错误的释放方法:导致new[]/ delete而不是new[]/的不匹配delete[].
  • 由于引用计数方案中的循环引用,内存不会自动释放,例如smart_ptr在圆形数据结构中使用时可能会发生,而不会注意使用weak_ptr循环链接.
  • 由于指针丢失,内存未被释放 - 在调用free之前,内存的最后一个指针被清除,因此无法释放它.
  • 由于无法正确识别何时不再需要内存,因此无法释放内存.一个例子是用于某些临时任务的静态缓存永远不会被清除.


Jus*_*cle 2

循环引用很常见,它们不能通过std::auto_ptr或解决boost::shared_ptr 。 清单上的(2)是无法替代的,这需要动动脑筋。