gpt4 book ai didi

ios - 为什么ios上fread不释放内存

转载 作者:行者123 更新时间:2023-11-30 17:56:39 29 4
gpt4 key购买 nike

我和我的同事花了很长时间试图解决这个问题。我们想要解析一个文件(定制的 3D 对象文件)。问题在于使用 fread、fseek 等 stdio 函数调用。

在下面的代码中,当我在调用之前和调用之后检查虚拟内存时,每次运行函数时都会丢失大约 1MB,我不知道为什么会发生这种情况。

FILE *fp= fopen([path UTF8String], "rb");
char *buffer = (char *) malloc(MAX_STRING_LENGTH);
while(!feof(fp))
{
fgets(buffer, MAX_STRING_LENGTH, fp);
}

if(0 == fclose(fp))
NSLog(@"File is closed");

free(buffer)

路径是从ios库生成的,MAX_STRING_LENGTH是任意大的数字(例如2000000)

还使用了 http://www.cplusplus.com/reference/clibrary/cstdio/fread/ 中的函数在示例中,内存错误仍然存​​在。

我知道缓冲区不是问题,因为如果我只使用创建缓冲区并释放它,则不会占用内存,但如果我使用 while 循环,则在文件关闭后并检查可用内存时,我会少一个内存比以前MB了。在过去的一周里,这让我和我的同事疯狂地试图解决这个问题。

编辑::

- (float)print_usage_memory
{
vm_statistics_data_t vmStats;
mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);

const int availablePages = vmStats.free_count;
float availableMemory = [self pagesToMB:availablePages];

/*
*/
const int totalPages = vmStats.wire_count + vmStats.active_count + vmStats.inactive_count + vmStats.free_count;
const int activePages = vmStats.active_count;
const int wiredPages = vmStats.wire_count;
const int purgeablePages = vmStats.purgeable_count;

NSMutableString* txt = [[NSMutableString alloc] initWithCapacity:512];
[txt appendFormat:@"\nTotal: %d (%.2fMB)\n", totalPages, [self pagesToMB:totalPages]];
[txt appendFormat:@" nAvailable: %d (%.2fMB)\n", availablePages, availableMemory];
[txt appendFormat:@" nActive: %d (%.2fMB)\n", activePages, [self pagesToMB:activePages]];
[txt appendFormat:@"nWired: %d (%.2fMB)\n", wiredPages, [self pagesToMB:wiredPages]];
[txt appendFormat:@"nPurgeable: %d (%.2fMB)\n", purgeablePages, [self pagesToMB:purgeablePages]];

NSLog(@"%@", txt);
[txt release];
txt = nil;

return availableMemory;
}


- (float)pagesToMB:(const int)pages
{
return pages*4/1024;
}

感谢您提供的任何帮助或对此的任何见解。

最佳答案

一些想法:

  1. 如果您在循环中运行测试,请确保排空循环内的自动释放池。否则,直到测试结束后它才会被排干,并且会扰乱您的测量结果。例如:

    for(int i = 0; i < TEST_COUNT; i++)
    {
    // If you're using ARC, you can instead replace this with an
    // @autoreleasepool block
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    run_my_fopen_fgets_fclose_test();
    [pool release];
    }
  2. 通过调用 setbuf(fp, NULL) 尝试使用无缓冲 I/O打开后立即在 FILE* 对象上。通常,stdio 通过使用 malloc 分配一个缓冲区来缓冲数据,以便它可以大块地读取文件数据,并且在调用 时使用 free 释放该缓冲区>f关闭。您正在关闭文件,因此不应泄漏,但以防万一它与您的内存测量发生冲突,可能值得尝试使用无缓冲 I/O 来获得更清晰的结果。

关于ios - 为什么ios上fread不释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347249/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com