我的代码由GCC编译时内存泄漏

时间:2013-11-17 19:00:34

标签: c++ visual-studio gcc memory-leaks

昨天我在Windows下用GCC 4.8.2编译我的数字信号处理框架时遇到了内存泄漏问题。 Implementing reference counts with C++

正如所建议的那样,我尝试使用Visual Studio 2012编译我的代码并且麻烦消失了。我该如何诊断这类问题?感谢。

3 个答案:

答案 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的目的是它是异常安全的,因此必须在堆栈中生存。