gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:15 28 4
gpt4 key购买 nike

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

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

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

我开始:

有时您会忘记将基类的析构函数定义为虚拟的。因此,所有派生类都由指向基类的指针引用,这些基类未被正确销毁并因此泄漏。

最佳答案

错误的类型远不止泄漏。从最坏到最好的顺序:

内存损坏。

数据被存储到不应该存储的区域。这导致了大多数安全问题并且是迄今为止最难追踪的问题。

  • “随机位置”腐败
    • 数据存储到用户可以控制的内存位置。
    • 数据存储到一个数组而不检查索引。
    • X 派生的类型的对象存储到为 X 的基类型保留的数组元素中,以及 X 的大小> 大于其基数。
  • 终身腐败
    • 数据在释放后存储到内存位置。
    • 使用了不正确的释放方法(不匹配导致 new/freemalloc/delete)
    • deletefree 在同一个指针上被调用了两次。

释放内存失败

程序不再使用的内存保持分配状态。

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

关于c++ - 最常见的内存/资源泄漏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1332670/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com