【问题标题】:Increase in Memory usage without leak?内存使用量增加而不会泄漏?
【发布时间】:2011-06-18 19:50:26
【问题描述】:

我有一个 CRTDBG 报告为没有泄漏的程序,但根据 Windows 任务管理器,随着时间的推移会占用更多内存。更糟糕的是,如果有足够的时间,它会以退出代码 -1 崩溃。

这是一个将成为游戏引擎的程序,现在我正在测试通过快速加载和卸载关卡来卸载关卡的功能。这似乎有效,否则“最后一个”级别的实体会撞到当前的实体。当我“正常”运行程序并加载一个级别而不卸载直到退出时,内存不会增加。

需要注意的是,加载关卡涉及从硬盘读取和打开文件。知道我正在使用 Chipmunk 物理库、Lua 和 OpenGL 可能也很重要。

最棘手的是 CRTDBG 不会转储,它在 main() 结束时返回 0。

编辑:另外,使用 Visual Studio 2008。

【问题讨论】:

  • 责备工具通常不会让你有任何收获。证明它,故意泄漏内存并验证它是否被报告。如果检查成功,您将需要分析您的程序以找出它保留数据时间过长的原因。
  • 好吧,在 main() 的开头添加一个“new”或“malloc”。所以它可能是某种自动收集,CRTDBG 不工作,或者我没有正确实现它。

标签: c++ memory-leaks


【解决方案1】:

对我来说,听起来你并没有真正泄漏内存,只是分配了很多,然后在出口释放它。

也许您持有一些在每个关卡加载之间忘记释放/删除的对象列表?

【讨论】:

    【解决方案2】:

    您可能正在观察“智能”分配器的效果,该分配器要求操作系统提供大块内存并进行子分配。您可以通过替换全局 operator newoperator delete 来检查。如果这些告诉你所有分配的内存也都被释放了,但进程的内存消耗上升或停留在那里,那么它(很可能)是分配器。

    【讨论】:

      【解决方案3】:

      Lua 的垃圾收集器会在需要时进行收集。如果您没有明确命令 Lua 进行收集,那么内存可能会在那里堆积而没有实际使用。

      【讨论】:

      • 强制垃圾收集器以与关卡加载相同的频率并不会停止它。
      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2019-06-21
      • 2019-11-11
      • 2013-07-12
      相关资源
      最近更新 更多