问题标签 [memory-leaks]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - How do you detect/avoid Memory leaks in your (Unmanaged) code?
In unmanaged C/C++ code, what are the best practices to detect memory leaks? And coding guidelines to avoid? (As if it's that simple ;)
We have used a bit of a silly way in the past: having a counter increment for every memory allocation call and decrement while freeing. At the end of the program, the counter value should be zero.
I know this is not a great way and there are a few catches. (For instance, if you are freeing memory which was allocated by a platform API call, your allocation count will not exactly match your freeing count. Of course, then we incremented the counter when calling API calls that allocated memory.)
I am expecting your experiences, suggestions and maybe some references to tools which simplify this.
c - C的内存泄漏检测器?
人们对哪些内存泄漏检测器有很好的体验?
以下是迄今为止的答案摘要:
Valgrind - 用于构建动态分析工具的仪器框架。
Electric Fence - 与 GDB 一起使用的工具
Splint - 注释辅助的轻量级静态检查
Glow Code - 这是一个完整的实时性能和内存分析器,适用于使用 C++、C# 或任何 .NET Framework 开发应用程序的 Windows 和 .NET 程序员
另请参阅此stackoverflow 帖子。
c++ - 查找由智能指针引起的内存泄漏
有人知道发现智能指针引起的内存泄漏的“技术”吗?我目前正在开发一个用C++编写的大型项目,该项目大量使用带有引用计数的智能指针。显然,我们有一些由智能指针引起的内存泄漏,它们仍然在代码中的某处被引用,因此它们的内存不会被释放。很难找到带有“不必要”引用的代码行,这会导致相应的对象不被释放(尽管它不再使用)。
我在网上找到了一些建议,建议收集引用计数器的递增/递减操作的调用堆栈。这给了我一个很好的提示,哪段代码导致引用计数器增加或减少。
但我需要的是某种算法,将相应的“增加/减少调用堆栈”组合在一起。删除这对调用堆栈后,我希望(至少)剩下一个“增加调用堆栈”,它向我展示了带有“不必要”引用的代码段,导致相应的对象未被释放。现在修复泄漏没什么大不了的!
但是有人对进行分组的“算法”有想法吗?
开发在Windows XP下进行。
(我希望有人理解,我试图解释的......)
编辑:我说的是循环引用引起的泄漏。
file-io - fdopen() 会导致内存泄漏吗?
我使用 fdopen 将流与打开的文件相关联。
当我close()
创建文件时,流是否也会自动取消关联,并且所有流内存都返回给操作系统,还是我需要知道 fdopen 文件并以特定方式关闭它?
-亚当
c++ - 此 C++ 代码是否会导致内存泄漏(将数组转换为新的)
我一直在研究一些使用可变长度结构 (TAPI) 的遗留 C++ 代码,其中结构大小将取决于可变长度字符串。这些结构是通过转换数组分配的,new
因此:
但是稍后使用delete
调用释放内存:
new[]
数组和非数组的这种混合delete
会导致内存泄漏还是取决于编译器?malloc
更改此代码以使用它会更好free
吗?
python - 如何检查 Guile 扩展模块中的内存泄漏?
我为 Guile 开发了一个扩展模块,用 C 编写。这个扩展模块嵌入了一个 Python 解释器。
由于此扩展模块调用 Python 解释器,我需要验证它是否正确管理 Python 对象占用的内存。
我发现 Python 解释器在其自己的内存处理中表现良好,因此通过运行 valgrind,如果没有其他干扰因素,我可以发现由于我自己的 Python 解释器嵌入代码中的错误导致的内存泄漏。
但是,当我在 valgrind 下运行 Guile 时,valgrind 报告内存泄漏。由于我自己的代码,此类内存泄漏掩盖了任何内存泄漏。
问题是我可以做些什么来将由于我的代码中的错误导致的内存泄漏与 valgrind 报告的由于 Guile 引起的内存泄漏分开。另一个工具而不是 valgrind?特殊的 valgrind 选项?放弃并依赖手动代码演练?
exception - 处理“java.lang.OutOfMemoryError: PermGen space”错误
最近我在我的 Web 应用程序中遇到了这个错误:
java.lang.OutOfMemoryError: PermGen 空间
它是运行在 Tomcat 6 和 JDK 1.6 上的典型 Hibernate/JPA + IceFaces/JSF 应用程序。显然,这可能会在重新部署应用程序几次后发生。
是什么原因造成的,可以做些什么来避免它?我该如何解决这个问题?
java - 您可以在诺基亚手机 (N80/N95) 上使用 Java Midlet 录制音频而不会导致 JVM 泄漏内存吗?
我想在带有 Java Midlet 的诺基亚手机上反复捕获音频片段。我目前的经验是使用 Sun 文档中的代码(参见:http: //java.sun.com/javame/reference/apis/jsr135/javax/microedition/media/control/RecordControl.html)并将其包装在“ while(true)" 循环有效,但应用程序会慢慢消耗手机上的所有内存,程序最终会抛出异常并且无法启动进一步的录制。
消耗的内存不是 Java 堆内存——我的示例程序(如下)显示 Java 内存大致保持静态,大约为 185,000 字节——但诺基亚提供的底层支持库中存在某种内存泄漏;我相信会发生内存泄漏,因为如果您在运行 Java 应用程序一段时间后尝试启动另一个(非 Java)应用程序(例如 Web 浏览器),手机会终止该应用程序并发出有关内存不足的警告。
我已经尝试了几种不同的方法,这些方法与 Sun 在文档中的规范示例所采用的方法不同(每次循环初始化所有内容,尽可能只初始化一次,调用尽可能多的解除分配风格的函数,这些函数不应该是绝对必要的ETC。)。似乎没有一个是成功的。下面是一个简单的示例程序,我认为它应该可以工作,但在 N80(尽管有固件更新)和 N95 上运行 15 分钟左右后崩溃。其他论坛也报告了这个问题,但那里提出的解决方案似乎不起作用(例如,参见:http ://discussion.forum.nokia.com/forum/showthread.php?t=129876 )。
java - 当我在 Thread 对象上调用 run() 时,为什么我的 Java 程序会泄漏内存?
(危险风格的问题,我希望当我遇到这个问题时答案已经在线)
使用 Java 1.4,我有一个方法我想在某些时候作为线程运行,但在其他时候不想。所以我将它声明为 Thread 的子类,然后根据我的需要调用 start() 或 run()。
但是我发现我的程序会随着时间的推移而泄漏内存。我究竟做错了什么?
java - 如何诊断由 Java 程序引起的 C 内存泄漏?
我正在开发一个导致 Sun 1.6 JVM (1.6_05) 内存泄漏的大型应用程序 (300K LOC)。分析 Java 显示没有泄漏。JVM 是否有任何可用的诊断程序可以检测到泄漏的原因?
我无法创建一个简单的、独立的 Java 测试用例。是通过在 JVM 上使用 C 堆分析器来解决这个问题的唯一方法吗?
该应用程序创建一个套接字池并执行大量网络 I/O。