我正在完成一项家庭作业,要求我编写一个泄漏内存的程序,跟踪它崩溃后会泄漏多少内存。
我对程序的一般想法是不断重新分配malloc指针。
到目前为止,这是我的代码:
char *oldMemory = malloc(125000); //1MB of memory.
char *newMemory = malloc(125000);
oldMemory = newMemory;
感谢您的时间和专业知识!
答案 0 :(得分:4)
不要忘记打印每次迭代时泄露的大小 - 即使程序崩溃,您也会看到结果。如果在访问之前测试失败的分配,程序不应该崩溃。
因此:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
enum { ALLOCSIZE = 125000 };
int main(void)
{
long long size = 0;
char *space = malloc(ALLOCSIZE);
while (space != 0)
{
size += ALLOCSIZE;
printf("OK %lld\n", size);
memset(space, '\0', ALLOCSIZE);
}
return(0);
}
Linux OOM可能会混淆事物;它允许过度承诺记忆。您必须在泄漏之前访问已分配的内存 - 因此memset()
(或者您可以使用calloc()
代替malloc()
)。
答案 1 :(得分:0)
当你在C中分配一些内存块时,你应该负责使用它来释放它
free()
功能。
如果你想确保你的程序不会因为一些内存泄漏而崩溃
在要求更多内存或使用分配的内存时,可以使用assert()
功能
你应该检查从malloc返回的返回指针,如果它是NULL,那么分配失败。 &GT;&GT;在linux内核中要小心malloc()
由于“内存过量使用”而无法返回NULL