WEB开发网
开发学院操作系统Linux/Unix 内存调试技巧 阅读

内存调试技巧

 2008-11-13 08:31:57 来源:WEB开发网   
核心提示: 因此,出于所有这些原因,内存调试技巧(2),需要特别关注 C 和 C++ 编程的内存问题,让我们看一看如何解决这些问题,本部分开头的句子提到了“资源”不是仅指“内存”,因为还有类似以下内容的示例(请参见清单 2),先不谈是哪种语言,内存错误的

因此,出于所有这些原因,需要特别关注 C 和 C++ 编程的内存问题。让我们看一看如何解决这些问题,先不谈是哪种语言。

内存错误的类别

首先,不要失去信心。有很多办法可以对付内存问题。我们先列出所有可能存在的实际问题:

内存泄漏

错误分配,包括大量增加 free() 释放的内存和未初始化的引用

悬空指针

数组边界违规

这是所有类型。即使迁移到 C++ 面向对象的语言,这些类型也不会有明显变化;无论数据是简单类型还是 C 语言的 struct 或 C++ 的类,C 和 C++ 中内存管理和引用的模型在原理上都是相同的。以下内容绝大部分是“纯 C”语言,对于扩展到 C++ 主要留作练习使用。

内存泄漏

在分配资源时会发生内存泄漏,但是它从不回收。下面是一个可能出错的模型(请参见清单 1):

清单 1. 简单的潜在堆内存丢失和缓冲区覆盖

  void f1(char *explanation)
  {
    char p1;
    p1 = malloc(100);
      (void) sprintf(p1,
              "The f1 error occurred because of '%s'.",
              explanation);
      local_log(p1);
  }

您看到问题了吗?除非 local_log() 对 free() 释放的内存具有不寻常的响应能力,否则每次对 f1 的调用都会泄漏 100 字节。在记忆棒增量分发数兆字节内存时,一次泄漏是微不足道的,但是连续操作数小时后,即使如此小的泄漏也会削弱应用程序。

在实际的 C 和 C++ 编程中,这不足以影响您对 malloc() 或 new 的使用,本部分开头的句子提到了“资源”不是仅指“内存”,因为还有类似以下内容的示例(请参见清单 2)。FILE 句柄可能与内存块不同,但是必须对它们给予同等关注:

上一页  1 2 3 4 5 6 7  下一页

Tags:内存 调试 技巧

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接