2012-07-18 34 views

回答

11

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(); 
+0

谢谢,如果不需要保留'myArray'指向的数据,哪个选项会更高效? – 2012-07-18 19:45:25

+2

如果中间'free'是不必要的,那么忽略它就更有效了。 – pb2q 2012-07-18 19:51:05

2

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

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

还应该提到的是,realloc的功能还涵盖了mallocfree的功能,给定了适当的参数值。你在代码的第二个循环中所做的实质上是在纯malloc模式下使用realloc

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(),并将结果直接分配给到同一个指针变量,如果重新分配失败,可能会导致内存泄漏,因为原始分配仍然存在。正确的方法是使用临时指针变量。

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; 
} 

噢,好吧,实际上回答你的问题:你不需要free()。

相关问题