【发布时间】:2014-01-21 18:10:22
【问题描述】:
我需要为一个进程分配所有可用内存,以实现对系统服务的测试。测试(除其他外)需要耗尽所有可用资源、尝试调用并检查特定结果。
为了做到这一点,我写了一个循环,重新分配一块内存,直到,realloc返回null,然后使用最后一个好的分配,然后切割最后一个成功数量和最后一个不成功数量之间的差异,直到不成功数量比上一次成功的数量大 1 个字节,保证所有可用内存都被消耗完。
我写的代码如下(还包括调试打印)
#include <stdio.h>
#include <malloc.h>
int main(void)
{
char* X;
char* lastgood = NULL;
char* toalloc = NULL;
unsigned int top = 1;
unsigned int bottom = 1;
unsigned int middle;
do
{
bottom = top;
lastgood = toalloc;
top = bottom*2;
printf("lastgood = %p\ntoalloc = %p\n", lastgood, toalloc);
if (lastgood != NULL)
printf("*lastgood = %i\n", *lastgood);
toalloc = realloc(toalloc, top);
printf("lastgood = %p\ntoalloc = %p\n", lastgood, toalloc);
if (toalloc == NULL && lastgood != NULL)
printf("*lastgood = %i\n", *lastgood); //segfault happens here
}while(toalloc != NULL);
do
{
if (toalloc != NULL) lastgood = toalloc;
else toalloc = lastgood;
middle = bottom+(top - bottom)/2;
toalloc = realloc(toalloc, middle);
if (toalloc == NULL) top = middle;
else bottom = middle;
}while(top - bottom > 1);
if (toalloc != NULL) lastgood = toalloc;
X = lastgood;
//make a call that attempts to get more memory
free(X);
}
根据 realloc 的手册页,如果 realloc 返回 null,它不会破坏之前的地址。即便如此,此代码在 toalloc 从 realloc 接收到 NULL 后尝试打印 lastgood 时会导致段错误。为什么会发生这种情况,有没有更好的方法来获取确切数量的未分配内存?
我在 glibc 上运行它,在内核 3.11.x 的 ubuntu 上运行它
【问题讨论】:
-
作为健全性检查,
realloc至少成功了一次,对吧? -
是的。它在最后几个周期产生以下输出: ii = 0x7f3be8806010 jj = 0x7f3b68805010 ii = 0x7f3b68805010 jj = 0x7f3b68805010 *ii = 0 ii = 0x7f3b68805010 jj = (nil) 分段错误(核心转储)
-
Linux 过度提交内存分配。要验证
realloc返回的内容实际上是可用,您需要,嗯,使用它。我不知道其他操作系统。 -
我正在使用它。每个周期。根据我之前的评论,它实际上是在没有段错误的情况下成功使用的。段错误仅在 realloc 失败时发生。查看评论中的输出!
-
realloc()失败时top的值是多少?
标签: c++ c segmentation-fault realloc