除了使用new之外,什么可能导致内存泄漏? (C ++)

时间:2017-01-12 09:57:25

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

除了使用new关键字分配内存之外,C ++中可能导致内存泄漏的原因是什么?我有一个项目,整个节目似乎有几个内存泄漏,但我没有使用过一次new关键字。此外,当我不小心让它运行了几个小时(4-6)时,我回来看它已经慢慢吞下cpu周期......不确定这是否是内存泄漏的直接结果(由此它点几乎占用了我所有的可用内存),因为在重新启动程序时它并没有明显发生,但是内存泄漏了。 谢谢!

3 个答案:

答案 0 :(得分:1)

可能是各种各样的事情,如

  • 一个不断增长的列表,例如添加到vector并且永不删除
  • 忘记关闭文件句柄,套接字等开放资源
  • 第三方库中的内存泄漏
  • 如果您是引用计数的循环引用

答案 1 :(得分:0)

有多种方法可以咀嚼CPU和内存。

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

字符串经常出现内存使用的罪魁祸首 - 如果您在程序开头附近读取了大量数据(例如XML配置等)并且不让它超出范围,那么它将一直延续到程序结束即使你没有明确地自己调用new。保持手柄打开,例如数据库连接,文件等也会占用资源。

如果您不使用引用或其他方式共享,您也可以轻松地最终复制数据。

尝试找到一种简单的方法来衡量你在做什么并从那里开始。

答案 2 :(得分:0)

  • 使用mallocrealloccalloc或平台特定的分配函数,例如mmap并丢失返回的指针。
  • 使用一个本身分配内存但不调用correspoding释放函数的函数(可能是构造函数)。例如,在不调用SDL_Init的情况下调用SDL_Quit
  • 使用第三方代码即使正确使用也会泄漏内存。