我在一个更大的程序中有内存泄漏,我相信这是它的原因。
#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进行测试。有什么想法吗?
答案 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);