昨天我在Windows下用GCC 4.8.2编译我的数字信号处理框架时遇到了内存泄漏问题。 Implementing reference counts with C++
正如所建议的那样,我尝试使用Visual Studio 2012编译我的代码并且麻烦消失了。我该如何诊断这类问题?感谢。
答案 0 :(得分:1)
在Linux上,您将使用valgrind,因此在Windows上,您可以尝试使用问题Is there Valgrind Memcheck like tool for windows to debug use after free errors?中建议的替代方案之一。
答案 1 :(得分:1)
好吧,你可能对VS做了一些不好的假设(例如,它是一个很好的编译器会告诉你什么时候出错),并且你写了一些非标准的兼容代码。
诊断此问题的最简单方法是在GCC中启动警告级别:
-std=c++11 -Wall -Wextra -pedantic
让所有这些警告消失,运气好的话,你的泄漏就会消失。如果没有,我建议在Linux上编译你的代码(如果可能的话)并通过valgrind运行它,这将追踪困扰你的问题。
答案 2 :(得分:1)
其他问题中的代码没有按照我的判断正确计算。您在构造函数中将m_refcount
初始化为零,并在Delete
函数中将其递减。据推测,还有一种AddRef
或类似的功能(未显示)会增加引用计数。
在Delete
中检查的条件是refcount > 1
,其中一个是关闭的。它应该是> 0
或>= 1
。
但是,我不明白为什么这适用于Visual Studio(你确定吗?它可能不起作用,因为它不正确)。
此外,您似乎并不理解lock_guard
的目的。你没有在堆上分配这些,这没有任何意义。您也可以在没有lock_guard
的情况下锁定和解锁互斥锁
lock_guard
的目的是它是异常安全的,因此必须在堆栈中生存。