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)
小智 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)
哦,好吧,实际上回答你的问题:你不需要释放().