【发布时间】:2014-10-19 19:33:52
【问题描述】:
这个问题可能看起来有点微不足道,我正在尝试用 C 编写一个程序,它只是在 OOM 被调用并杀死它之前尽可能多地消耗内存。虽然,我最初使用 malloc() 和 memset( ),这次我决定尝试 realloc()。我这样做纯粹是为了学习,因为我是 C 新手。
我打算在每次调用 realloc() 和 memset() 时分配 1MB。当我运行这个程序来分配 20MB 时:
1) 我不明白为什么在输出中有些地址是相同的 (2-4) (5-10) & (11-20) ?难道不是每个地址都不同吗?
2) 我的程序真的消耗 20MB 内存吗?我确实通过 Valgrind 运行了它,它说“1 个块中的 22,020,096 个字节肯定丢失在 1 的丢失记录 1 中”
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <error.h>
#include <unistd.h>
int main (int argc,char **argv) {
char *ptr;
int max = 0;
int max_write;
int sleep_time;
size_t size = 1048576;
if (argc > 1) {
sleep_time = (argv[2] ? atoi(argv[2]) : 2 );
max_write = (argv[1] ? atoi(argv[1]) : 1000);
printf (" + To Write: %d,%d\n",max_write,sleep_time);
}
ptr = (char *) calloc (1,size);
if (ptr == NULL) {
perror("calloc Error:");
}
printf(" + Allocation: %p\n",ptr);
do {
max++;
size += (1048576);
ptr = (char *) realloc (ptr,size);
if (ptr == NULL) {
perror("realloc Error:");
}
memset(ptr,0,size);
printf(" + Pointer: %p / Memory: %d\n",ptr,max);
} while (max != max_write);
//
return(0);
}
OUTPUT:
./eatmemory 20
+ Allocation: 0x7f2bb6b12010
+ Pointer: 0x7f2bb6451010 / Memory: 1
+ Pointer: 0x7f2bb6150010 / Memory: 2
+ Pointer: 0x7f2bb6150010 / Memory: 3
+ Pointer: 0x7f2bb6150010 / Memory: 4
+ Pointer: 0x7f2bb5b4f010 / Memory: 5
+ Pointer: 0x7f2bb5b4f010 / Memory: 6
+ Pointer: 0x7f2bb5b4f010 / Memory: 7
+ Pointer: 0x7f2bb5b4f010 / Memory: 8
+ Pointer: 0x7f2bb5b4f010 / Memory: 9
+ Pointer: 0x7f2bb5b4f010 / Memory: 10
+ Pointer: 0x7f2bb4f4e010 / Memory: 11
+ Pointer: 0x7f2bb4f4e010 / Memory: 12
+ Pointer: 0x7f2bb4f4e010 / Memory: 13
+ Pointer: 0x7f2bb4f4e010 / Memory: 14
+ Pointer: 0x7f2bb4f4e010 / Memory: 15
+ Pointer: 0x7f2bb4f4e010 / Memory: 16
+ Pointer: 0x7f2bb4f4e010 / Memory: 17
+ Pointer: 0x7f2bb4f4e010 / Memory: 18
+ Pointer: 0x7f2bb4f4e010 / Memory: 19
+ Pointer: 0x7f2bb4f4e010 / Memory: 20
【问题讨论】: