这个问题可能看起来微不足道,我正在尝试用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的丢失记录中”
#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
答案 0 :(得分:2)
正如documentation for realloc()
中所述,并在this SO answer中进一步解释,
该功能可能会将内存块移动到新位置
这意味着如果内存管理器可以在内存中的同一点分配请求的大小,它可以返回相同的指针。
对于(2),究竟是什么意思&#34;它真的分配了20MB吗?&#34; 如果你问realloc()
20MB它会给你一块至少是那个大小,如果失败则为NULL
。如果它没有完全违背该功能的目的。
答案 1 :(得分:2)
1)我不明白为什么在输出中一些地址是相同的(2-4)(5-10)&amp; (11-20)?不应该每个人都不同。
正如其他人已经说过的那样,realloc并不一定要移动现有的内存块,但可能只是扩展它。
2)我的程序真的消耗了20MB的内存吗?我确实通过Valgrind进行了操作,它说&#34; 1块中的22,020,096字节肯定会丢失在丢失记录1中的1&#34;
这在某种程度上是特定于实现的,但您通常最终会声称拥有的内存比您要求的多。首先,free需要一些关于如何将内存与相邻的空闲块合并的元数据。此信息通常位于alloc / realloc将返回的地址之前的几个字节中。此外,内存可能不会以允许任意大小分配的方式进行组织,因此malloc将返回最适合的内存。
答案 2 :(得分:1)
实际上,如果地址重复,它看起来还不错。
它实际上做的是:
好的,我有一个指针,需要将其调整为X.在此指针后直接留下多少内存?
是Y.如果Y大于X,那么我真的不必移动我的记忆,我只是将未使用的空间分配给我的指针。
如果Y低于X,则此处不适合。可能还有另一个变量,它阻止我扩展我的指针。好吧,让我们把它移到其他地方,以及所有数据。请记住,我的指针需要指向连续内存区域。
我真的没有得到关于20mb的问题。你是否担心,它需要更多的东西?不能说我知道原因,但尝试使用另一个迭代并检查valgrind结果是否有所不同:也许这是一些运行时优化和预先分配更多空间的问题?但说实话,这是一个盲目的猜测。