恐惧造成的泄漏

时间:2012-04-14 17:19:36

标签: c++ ios xcode memory-leaks

我正在分析我编写的游戏的代码,我想知道以下代码段每次执行时如何有可能导致堆增加4kb(我正在使用Xcode的快照分析进行概要分析): / p>

u8 WorldManager::versionOfMap(FILE *file)
{
  char magic[4];
  u8 version;

  fread(magic, 4, 1, file); <-- this is the line
  fread(&version,1,1,file);
  fseek(file, 0, SEEK_SET);

  return version;
}

根据分析器,每次调用函数时,突出显示的行分配4.00Kb的内存和malloc,内存永不释放。这个问题似乎发生在代码周围对fread的其他调用,但这是最令人讨厌的。

我有什么微不足道的错过吗?这是我不应该关心的内部事情吗?

就像一张纸条:我正在iPhone上进行分析,它被编译为发行版(-O2)。

1 个答案:

答案 0 :(得分:3)

如果您所描述的内容确实发生且您的代码在其他地方没有错误,我认为这是实施中的错误。

我认为更有可能是你没有关闭文件。如果设备是非交互式的,则默认情况下Stdio流使用缓冲,并且在打开文件或执行I / O时分配缓冲区。虽然只应分配一个缓冲区,但您肯定会忘记关闭文件来泄漏缓冲区。但当然,关闭文件应释放缓冲区。不要忘记检查fclose返回的值。

为了说明你正在关闭文件,你的代码中还有一些其他的nits,它们不会引起这个问题,但无论如何我都会提到。

首先你的fread调用读取一个大小为4的成员的对象。实际上有一个对象有4个大小为1的成员。换句话说,fread的数字参数被交换。这仅在返回值的含义上有所不同(在部分读取的情况下很重要)。

其次,当您第一次拨打fread正确地将char的大小硬编码为1(在C中,即'size'的定义)时,使用{可能更好地风格化在sizeof(u8)的第二次调用中{1}}。

如果这确实是内存泄漏的想法是正确的解释(并且其他地方没有任何错误)那么您可以通过关闭此特定文件的stdio缓冲来解决此问题:

fread

即使我们假设这确实是一个错误,并且泄漏是真实的,但是将代码压缩到仍然可以证明问题的最小可能示例是非常值得的。如果这样做揭示了真正的错误,那么你就赢了。否则,您将需要最小的示例来报告实现中的错误。