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

str*_*eek 6 c malloc pointers memory-management

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;
}
Run Code Online (Sandbox Code Playgroud)

pb2*_*b2q 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();
Run Code Online (Sandbox Code Playgroud)

  • 如果中间的"free"是不必要的,那么自然地省略它是更有效的. (2认同)

小智 5

没有一个.你应该总是检查realloc返回NULL; 如果你不这样做,你就会泄漏记忆.此外,您正在转换分配器函数的返回值,这是不可取的.此外,您最好使用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;
}
Run Code Online (Sandbox Code Playgroud)

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