char指针是struct array内存泄漏

时间:2013-06-10 10:19:49

标签: c pointers memory malloc memory-leaks

我在一个更大的程序中有内存泄漏,我相信这是它的原因。

#include <stdlib.h>
#include <Windows.h>

typedef struct _struct{
    char* name;
} str;

int main() {
    system("PAUSE");

    str* Character = (str*)malloc(sizeof(str) * 20000);

    for(int i = 0; i < 20000; i++){
        Character[i].name = (char*)malloc(20000);   // Assign memory.
    }

    for(int i = 0; i < 20000; i++){
        free(Character[i].name);            // Free memory.
    }

    free(Character);
    system("PAUSE");
}

第一次暂停时的记忆:~500K。

第二次暂停时的记忆:~1.7M。

使用VS2012进行测试。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您如何衡量程序占用的内存量?最重要的是,您正在查看操作系统正在跟踪的工作集的大小。由于您已经分配并释放了大量内存,因此该集的大小已经增加。有些操作系统会在一段时间后调整工作集的大小,有些则不会。我们在这看什么操作系统?

答案 1 :(得分:3)

当您调用malloc时,将在堆上分配内存。如果堆上剩余的空间不足,程序将要求操作系统获取更多内存,并获取另一个块。在程序完成之前,通常不会返回从OS获取的内存(尽管这取决于操作系统)。

单独的程序大小通常不能用于检查内存泄漏!使用Valgrind或类似工具检查永远不会获得free d。

的内存

答案 2 :(得分:-1)

str * Character =(str *)malloc(sizeof(str)* 20000);

在上面的行中,您将通过查找结构的大小来分配内存。在这里,您将获得的结构大小将是指针宽度的大小,而不是char的大小。

例如,假设指针宽度为32位,它将分配(4 * 20000)= 80000字节。

如果要分配20000个结构,

str * Character =(str *)malloc(sizeof(char)* 20000);