我是Windows平台上的C++程序员.我正在使用Visual Studio 2008.
我通常在内存泄漏的代码中结束.
通常我通过检查代码发现内存泄漏,但它很麻烦,并不总是一个好方法.
由于我买不起付费内存泄漏检测工具,我希望你们建议尽可能避免内存泄漏的方法.
我有.exe加载的.exe和许多插件.dll模块.(我有两者的来源.)跨平台(带源)解决方案是理想的,但平台可以缩小到WinXP和Visual Studio(在我的情况下为7.1/2003).
内置的VS泄漏检测器只给出了调用new/malloc的行,但是我有一个分配包装器,所以完整的符号堆栈跟踪是最好的.
检测器还能够检测.exe及其附带的插件.dll模块中的泄漏.
什么内存泄漏探测器有人有很好的经验?
以下是目前答案的摘要:
Valgrind - 用于构建动态分析工具的仪器框架.
电围栏 - 与GDB一起使用的工具
夹板 - 注释辅助轻量级静态检查
Glow Code - 这是一个完整的实时性能和内存分析器,适用于使用C++,C#或任何.NET Framework开发应用程序的Windows和.NET程序员
另请参阅此stackoverflow帖子.
我被要求维护一个充满内存泄漏的大型C++代码库.在探索时,我发现我们有很多缓冲区溢出导致泄漏(它如何变坏,我不想知道).
我决定先删除缓冲区溢出.为了使我的bug更容易找到,可以使用哪些工具来检查缓冲区溢出?
什么内存泄漏检测工具可用于Windows上的开源C/C++?
我在大学里学到,你总是要释放你未使用过的物品,而不是你实际上是如何做到的.例如,正确构建代码等等.关于如何在C++中处理指针有什么一般规则吗?
我目前不允许使用提升.我必须坚持使用纯c ++,因为我使用的框架禁止使用泛型.
我有一个由Visual Studio 2010运行的C++程序,如何监视程序的内存使用情况?是否存在简单的API,例如我可以调用clock_t start1和start1 = clock();监视程序的时间使用情况.谢谢:)
我想检查我的所有内存在C++中的Visual Studio 2008中是否已被释放.我听说我可以添加一些包含,也许可以写一些代码行,应该这样做.
有谁知道我怎么做?
提前致谢,
格雷格
例如:
struct Vertex
{
int x;
int y;
};
Vertex makeVertex(int xpos, int ypos)
{
Vertex tmp = {xpos, ypos};
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,我会得到内存泄漏吗?:
Vertex a = makeVertex(30,40);
a = makeVertex(5, 102);
Run Code Online (Sandbox Code Playgroud) 我对内存泄漏非常谨慎,所以我认为我已经验证了这一点.在下面的例子中会出现内存泄漏吗?我的直觉是肯定的.
class Handler // Class definition
{public:
~Handler();
int* ptrToInts;
};
Handler::~Handler() // Class destructor
{
delete[] ptrToInts;
}
Handler handler; // Global object
void aFunction()
{
handler.ptrToInts = new int[20];
}
int main()
{
bool quit = false;
while(!quit)
{
aFunction();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在heapeach时间,ptrToInts会在单独的内存中创建20个单独的新int?
另外,另一个问题是,如果不是析构函数,是否会释放动态分配的内存?看到类的生命周期是程序的持续时间,它会清除所有"新"内存吗?
编辑:谢谢你的回答.我问这个的原因是因为我试图绕过调用new并删除WadProc每次基本上调用Raw Input,这就是MSDN告诉你这样做的方式.似乎非常低效.
亲爱的各位议员,我对是否在正确的地方释放记忆感到困惑.特别是*sResult?
int ReadToSerialPort( char *psResponse, int iMax)
{
size_t iIn;
if ( fd < 1 )
{
printf( "port is not open\n" );
return -1;
}
iIn = read( fd, psResponse, iMax-1 );
if ( iIn < 0 )
{
if ( errno == EAGAIN )
{
printf( "The errror in READ" );
return 0; // assume that command generated no response
}
else
printf( "read error %d %s\n", errno, strerror(errno) );
}
else
psResponse[(int)iIn<(int)iMax?iIn:iMax] = '\n';
return iIn;
} …Run Code Online (Sandbox Code Playgroud) c++ ×10
memory-leaks ×6
memory ×4
c ×3
pointers ×2
debugging ×1
heap ×1
open-source ×1
winapi ×1
windows ×1