在使用realloc之前是否需要释放指针变量?

时间:2012-07-18 19:26:58

标签: c pointers memory-management malloc

在再次使用realloc作为指针变量之前,是否需要释放内存。以下哪项是正确的?

for(i = 0; i < n; i++){
   myArray = (int *)realloc(myArray, i*sizeof(int));
}

for(i = 0; i < n; i++){
   myArray = (int *)realloc(myArray, i*sizeof(int));
   free(myArray);
   myArray = NULL;
}

4 个答案:

答案 0 :(得分:14)

realloc的具体用处是需要free才能使用它:它存在以增加已经分配的内存。

所以它不是必需的,并且不常见。传递NULL指针时,realloc的行为为malloc。如果您在调用之前使用free,那么您也可以使用malloc

由于您省略了错误处理,因此这两个示例都不正确。所有分配器都可以返回NULL,在这方面使用realloc有点棘手。仔细阅读文档和示例。具体来说,ptr = realloc(ptr, ...总是一个坏主意,因为如果realloc失败并返回NULL,那么您刚刚丢失了引用并泄露了内存。而是使用tmp变量,例如:

tmp = realloc(ptr, newSize);
if (tmp != NULL)
    ptr = tmp;
else handle_error();

答案 1 :(得分:5)

都不是。你应该总是检查realloc返回NULL;如果你不这样做,你就会泄漏记忆。此外,您正在转换分配器函数的返回值,即not advisable。此外,您最好使用sizeof(*myArray)而不是显式sizeof(type)构造,因为如果您稍后更改数组/指针的类型,并且您忘记在此处更改类型,那么您将成为面临难以追踪的段错误和/或内存泄漏错误。总结一下:

for(i = 0; i < n; i++){
    int *tmp;
    tmp = realloc(myArray, i*sizeof(*myArray));
    if (tmp == NULL)
    {
        free(myArray);
        /* And handle error */
    }
    myArray = tmp;
}

哦,好吧,实际上回答你的问题:你不需要释放()。

答案 2 :(得分:4)

这取决于你想做什么。 realloc()专门用于获取现有分配并更改其大小,尽可能多地保留数据。你提供的两个例子都是正确的,因为它们会编译,但它们会做不同的事情。

realloc(NULL, n)malloc(n)相同,因此第二种情况在语义上等同于:

for(i = 0; i < n; i++){
   myArray = (int *)malloc(i*sizeof(int));
   free(myArray);
   myArray = NULL;
}

在第一个示例中,myArray指向的数据将被保留。在第二个示例中,现有分配将被丢弃并替换为全新的未初始化分配。原始分配指向的任何数据都将被丢弃。


应该注意的是,如果分配失败,realloc()将返回NULL - 但如果您传递了非NULL指针,则该分配将不会被释放。将一个指针传递到realloc()并将结果直接分配到同一个指针变量中,如果重新分配失败,可能会导致内存泄漏,因为原始分配仍然存在。正确的方法是使用临时指针变量。

答案 3 :(得分:2)

没有。为什么? realloc的重点是它重新分配现有的内存块,保留已存储在该内存块中的值。这个想法是,在某些情况下,它可能会重用现有的内存位置,而不是分配一个全新的内存块并在那里复制旧值。

如果您不关心保留旧块的内容,那么您可能根本不需要realloc

还应该提到realloc的功能还包括mallocfree的功能,给定适当的参数值。您在代码的第二个周期中所做的工作主要是在纯realloc模式下使用malloc

相关问题