我在一个较大的程序中有内存泄漏,我相信这是它的原因。
#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进行测试。什么好主意吗?
如何测量程序占用的内存量?我想到的一件事是,您正在查看操作系统正在跟踪的工作集的大小。由于您已经分配和释放了大量内存,因此该集合的大小增加了。有些操作系统会在一段时间后调整工作集的大小,有些则不会。我们现在看到的是什么操作系统?
当您调用malloc
时,内存被分配到堆上。如果堆上剩余的空间不足,程序将向操作系统请求更多内存,并获取另一个块。从操作系统获得的内存通常在程序完成后才返回(尽管这取决于操作系统)。
程序大小通常不能单独用于检查内存泄漏!使用Valgrind或类似的工具来检查从未获得free
d的内存
str* Character = (str*)malloc(sizeof(str) * 20000);
在上面的行中,您通过查找结构体的大小来分配内存。在这里,你将得到的结构体的大小将是指针宽度的大小,而不是char的大小。
假设例如,如果指针宽度为32位,它将分配(4 * 20000)= 80000字节。
如果你想分配20000个结构体,
str* Character = (str*)malloc(sizeof(char) * 20000);