【问题标题】:What can cause memory leaks other than using new? (c++) [closed]除了使用 new 之外,还有什么会导致内存泄漏? (c++) [关闭]
【发布时间】:2017-01-12 09:57:25
【问题描述】:

除了使用 new 关键字分配内存之外,还有什么会导致 C++ 中的内存泄漏?我有一个项目,整个节目似乎都有几个内存泄漏,但我没有使用过一次 new 关键字。另外,当我不小心让它运行了几个小时(4-6)时,我回来发现它也在慢慢吞噬 cpu 周期......不确定这是否是内存泄漏的直接结果(通过这个指出它几乎使用了我所有的可用内存),因为再次启动程序时它并没有明显发生,但是内存泄漏是。 谢谢!

【问题讨论】:

  • 您自己可能不会直接调用new,但您从另一方调用的函数可能会。没有代码我们无法知道。
  • 对于内存泄漏调试,您可以使用 Valgrind。

标签: c++ memory memory-management memory-leaks


【解决方案1】:

可能是各种各样的东西

  • 不断增长的列表,例如添加到 vector 并且永远不会删除
  • 忘记关闭文件句柄、套接字等打开的资源。
  • 第三方库中的内存泄漏
  • 循环引用(如果您要进行引用计数)

【讨论】:

    【解决方案2】:
    • 使用mallocrealloccallocmmap 等平台特定的分配函数并丢失返回的指针。
    • 使用本身分配内存的函数(可能是构造函数),但不调用相应的释放函数。例如,调用SDL_Init 而不调用SDL_Quit
    • 使用第三方代码即使正确使用也会泄漏内存。

    【讨论】:

      【解决方案3】:

      消耗 CPU 和内存的方法有很多种。

      分析是查看 CPU 使用情况的最佳工具。如果你有一些日志记录,你应该能够知道它在哪里花费时间。

      字符串是内存使用的罪魁祸首 - 如果您在程序开始附近读取大量数据(例如 XML 配置等)并且不让它超出范围,它会一直徘徊直到程序结束,即使您自己没有明确调用new。保持把手打开,例如数据库连接、文件等也会消耗资源。

      如果您不使用引用或其他共享方式,您也很容易最终复制数据。

      尝试找到一种简单的方法来衡量您正在做的事情并从那里得到它。

      【讨论】:

        猜你喜欢
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 2017-02-13
        相关资源
        最近更新 更多