没有free()的malloc()调用真正的真正后果是什么?它可以使程序变得疯狂,例如永远循环吗?

Jac*_*ack 0 c linux 32-bit icc

我目前的计划中存在很大问题.在循环内部,两个函数,如果我在这个循环中做另一个函数调用,我得到一个永远的循环!甚至printf("bah");给一个永远的循环.

这给了正常执行.

//size = 10 (example)
while(size > 0) {
  a(); // decrement by 2
  b(); // decrement by 2
}
Run Code Online (Sandbox Code Playgroud)

//size = 10 (example)
while(size > 0) {
a(); // decrement by 2
b(); // decrement by 2
putchar(' ');
}
Run Code Online (Sandbox Code Playgroud)

永远循环.唯一不同的是putchar()电话.

很难假设某些东西,但有些想法是什么呢?

什么a() andB()`函数基本上做的是:

从阵列中得到两个结构,减小size通过1printf()它的一些成员.这样的结构仅在程序结束时才被释放.

我将这部分代码发布给了tro,以便了解(可信)讨厌的内容.这部分代码中的所有代码都是非常大的(在这里发布给我们阅读).

编辑:

这是一个最小的a()b()实用的:

void a(void) {
  foo_t* f = top;
  while(f->y == STATE_X) {
  get(&a); get(&b); /* it's equivalent to pop() in a linked list. size is size=size-1 in each get call() */
  printf("%d,%d\n",a->x,ab->x);
  f = f->next;
 }
 top = f;
}

void a(void) {
  foo_t* f = top;
  while(f->y == STATE_Y) {
  get(&a); get(&b); /* it's equivalent to pop() in a linked list. size is size=size-1 in each get call() */
  printf("%d,%d\n",a->x,ab->x);
  f = f->next;
 }
 top = f;
}
Run Code Online (Sandbox Code Playgroud)

get()- pop()在我的背景下是我的等价物.

top - 指向最后struct footype从堆栈处理的点.

size - 当前堆栈元素的数量.

struct footype被Implemeted一个为链接这也,有一个prevnext它指向先前和它的下一个成员.

cHa*_*Hao 5

如果我们完全按照你所说的关于未显示的代码的说法 - 内存被分配但从未被释放 - 那么该内存将保持分配直到程序结束.如果你继续分配更多内存而不释放任何内存,最终你会耗尽......此时malloc可能会开始失败并返回空指针.(当然,如果我们遵循C标准,尝试通过空指针访问内存可能会导致各种各样的诡计.但Linux中最常见的结果是段错误.)

但是,如果没有ulimit设置,您可能也会耗尽所有交换空间,这可能导致最终的大幅放缓.当然,在您的过程中使用所有内存,将其从其他进程中移除.最终,可能会发生两件事之一:

  • 其他进程可能开始无法分配内存......如果他们没有考虑到这一点,他们可能会破坏.

  • Linux将故意分发虚构内存 - 基本上,内存页面既不受RAM也不支持交换空间.(原因有点复杂,但在上下文中有意义.)只有当一个进程试图实际使用该内存时,内核才能为它获取一些内存.如果没有空闲RAM并且没有交换空间,内核将终止现有进程以回收其虚拟内存.

    (如果它走得那么远,有一个算法可以决定杀死哪个进程.它通常更喜欢那个记忆最差的进程 - 在这种情况下,可能是你的进程.)

但这是关于损害的程度.你会慢慢放慢脚步,搞乱其他进程,并可能让其中一个被杀(可能是你的).

至少在它自己的情况下,它不会做的一件事是导致循环永远持续下去.为了使其成为原因,程序必须(1)检查失败,并且(2)循环永远重试失败的操作直到成功,而不改变与操作相关的任何事情.

还有其他事情发生在这里.