如何在C或C++中查找内存泄漏?

编程软件中的内存泄漏可能很难精确定位,因为这里面有大量的数据。本文中,您可以学习如何借助运行时错误检测工具查找C和C++应用程序中的内存泄漏。

什么是内存泄漏?C和C++语言实例

当您面临内存泄漏时,C++和C有一套运行时检测工具,这些工具有助于提高性能。对于那些经常使用C或C++编写代码的人来说,内存泄漏已经见怪不怪。维基百科中对于内存泄漏的定义如下:

在计算机科学中,内存泄漏是一种资源泄漏,当计算机程序错误地管理内存分配,导致不再需要的内存无法释放时,就会发生这种情况。当对象存储在内存中但运行的代码无法访问时,也可能发生内存泄漏。

以下显示的运行“Hello world”的程序是这种行为的最佳示例之一。

图片

如果我们使用以下参数执行此程序:

图片

如果我们在第25行检查程序的状态,就在第二次执行对malloc的调用之前,我们观察到:

  • 到目前为止,变量字符串指向字符串“hello”,该字符串是上一次循环迭代的结果。

  • 变量字符串指向在该循环迭代中分配的扩展字符串“hello-this”。

这些赋值示意图如下;这两个变量都指向动态分配的内存块。

下一句话:

图片

将创建指向较长内存块的两个变量,如下所示:

图片

然而,一旦发生这种情况,就没有剩余的指针指向较短的块。即使您愿意,也不可能回收先前由string_so_far指向的内存;它现在被永久分配。这被称为“内存泄漏”。C++和C经常面临这些常见问题,因此尽早发现它们很重要。

如何在C++和C中发现内存泄漏?

虽然没有“检测内存泄漏”按钮,但C++和C有运行时检测工具可以提供帮助。这种类型的错误可以通过内存错误检测工具进行诊断,如Parasoft Insure++。如下所示:

图片

此示例被称为LEAK_SSIGN,因为它是在重新分配指针时引起的。(附言:其他内存调试器通常不会区分未处理内存和实际泄漏内存,但Insure++会区分。)在这种情况下,未处理内存不是优质的内存,而是你没有释放的内存,与实际泄漏不同,实际泄漏是你无法释放的内存。

内存泄漏的种类

Parasoft Insure++还可以自动检测其他几种类型的泄漏。

泄露种类 描述
LEAK_FREE 在释放一个包含指向其他内存块的指针的内存块时发生。
LEAK_RETURN 当函数返回指向已分配内存块的指针,但返回的值在调用例程中被忽略时发生。
LEAK_SCOPE 当函数包含指向内存块的局部变量,但函数返回时没有将指针保存在全局变量中或将其传递回调用方时发生。

请注意,错误消息指出了问题发生的确切源行,而不仅仅是块的分配位置,这是查找和修复内存泄漏的关键问题。这一点非常重要,因为在应用程序中引入细微的内存泄漏很容易,但很难全部找到。

猜你喜欢

转载自blog.csdn.net/m0_67129275/article/details/132758446
今日推荐