c – 由fread引起的泄漏

c – 由fread引起的泄漏,第1张

概述我正在分析我写的一个游戏的代码,我想知道如何在以下代码片段中每次执行一次堆增加4kb(我在使用 Xcode的Heapshot Analysis进行剖析) u8 WorldManager::versionOfMap(FILE *file){ char magic[4]; u8 version; fread(magic, 4, 1, file); <-- this is the lin 我正在分析我写的一个游戏的代码,我想知道如何在以下代码片段中每次执行一次堆增加4kb(我在使用 Xcode的Heapshot Analysis进行剖析)
u8 WorldManager::versionOfMap(file *file){  char magic[4];  u8 version;  fread(magic,4,1,file); <-- this is the line  fread(&version,file);  fseek(file,SEEK_SET);  return version;}

根据分析器,每次调用函数时,突出显示的行分配了一个带有malloc的4.00Kb内存,不会释放的内存.这个事情似乎发生在其他调用,围绕代码,但这是最卑劣的一个.

有没有什么琐事我失踪了?是不是内在的东西我不在乎?

就像一个注释:我在iPhone上分析它,它被编译为release(-O2).

解决方法 如果你正在描述的是真的发生,你的代码在其他地方没有错误,那么这个实现是一个错误.

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

假设为了说明您正确关闭该文件,您的代码中还有其他几个不会导致此问题的其他nits,但是我还是会提到.

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

第二,当你的第一次调用正确地硬编码char的大小为1(在C中,这是’size’的定义),在第二次调用中使用sizeof(u8)可能更好的风格.

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

bool WorldManager::versionOfMap(file *file,bool *is_first_file_io,u8 *version){  char magic[4];  bool ok = false;  if (*is_first_file_io)   {    // we ignore failure of this call    setvbuf(file,NulL,_IONBF,0);    *is_first_file_io = false;  }  if (sizeof(magic) == fread(magic,sizeof(magic),file)       && 1 == fread(version,sizeof(*version),file))  {      ok = true;  }  if (-1 == fseek(file,0L,SEEK_SET))  {      return false;  }  else  {      return ok && 0 == memcmp(magic,EXPECTED_MAGIC,sizeof(magic));  }}

即使我们以假设这真的是一个错误,漏洞也是真实的,那么将代码尽可能的缩小到尽可能简单的例子中.如果这样做会揭示真正的错误,你就会赢了.否则,您将需要最小的示例来报告实施中的错误.

总结

以上是内存溢出为你收集整理的c – 由fread引起的泄漏全部内容,希望文章能够帮你解决c – 由fread引起的泄漏所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1248716.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存