繁体   English   中英

realloc释放现有的内存?

[英]does realloc free the existing memory?

我试图在下面的程序中使用realloc重新分配内存,并在realloc初始内存后检查我使用malloc(i =(int *)malloc(5 * sizeof(int)))仍然存在与否,使用下面的程序i能够在使用另一个指针(即* m)检查的realoc之后访问数据。 这是正确的行为吗? 一旦realloc调用,内存应该是免费的吗?

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
       int *i,*jn, *m;
       i = (int*)malloc(5 * sizeof(int));
       int j,k=10;

      for(j=0 ;j<5; j++)
      {
         i[j] = j;
         printf("%d \n",i[j]);
      }

      for(j=0 ;j<5; j++)
      {
        printf("%p\n",i++);
      }

      jn = (int *)calloc(5, sizeof(*i));

      for(j=0 ;j<5; j++)
      {
         printf("%p\n",jn++);
      }

       i = i-5;
       m = i;

      printf("m = %p  %d\n",(m+1), *(m+1));

      i =(int *)realloc(i,8*sizeof(int));

      for(j=0 ;j<8; j++)
      {

         printf("%d\n",i[j]);
      }

      for(j=0 ;j<8; j++)
      {

        printf("%p\n",i++);
      }
      printf("m = %p  %d\n",(m+1), *(m+1));

      return 0;
}

首先, realloc可能会决定

  1. 分配新的内存块,复制数据并释放原始内存块,或

  2. 只需“原位”扩展/收缩原始块,而无需分配新块。

它将选择哪种方法取决于实施和各种其他外部因素。 它可能遵循第一种方法。 或者它可能遵循第二种方法。 您可以通过比较realloc之后的指针im的值来轻松找出它遵循的方法。

其次,如果realloc决定遵循第一种方法(即分配一个新的内存块),那么旧的块确实被realloc释放。 在这种情况下,尝试访问原始内存位置会导致未定义的行为。

如果realloc决定遵循第二种方法(即“原位”扩展或缩小原始内存块),那么mi将继续指向相同的位置。 在这种情况下,通过m看到相同的数据并不奇怪。

PS这意味着代码的行为要么是微不足道的,要么是未定义的 它不能真正用于分析行为是否“正确”。 如果内存确实被释放,你期望发生什么?

realloc相当于:

void *
realloc(void *old, size_t newsz)
{
    size_t old_sz = internal_function_that_finds_old_size(old);
    void *new = malloc(newsz);
    if (new == NULL)
        return NULL;
    memcpy(new, old, oldsz);
    free(old);
    return new;
}

realloc可以做更高效的事情,包括不更改指针,只是将大小分配得更大,它可以使用内核工具将内存映射到其他地方以避免副本等。但一般来说realloc应该被视为完全按照我所写的内容执行因为这是最糟糕的情况。

现在,谈到您的计划。 你通过无效指针触摸记忆,任何事情都可能发生。 在调用realloc之后, m停止成为有效指针。 这并不意味着任何人都会阻止你使用它,它只是意味着如果你使用它,你的程序将不再保证做任何明智的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM