为什么我不必在重新分配时从堆中释放内存?

时间:2016-12-11 23:28:09

标签: c realloc

所以我有这段代码:

/* Dynamic Array Reader */

/* Parameters:
 * n: Number of values to be read
 * 
 * Returns: pointer to the dynamically allocated array
 */
int *dyn_reader(unsigned int n) {
    int* array = malloc(n * sizeof (int));
    if (!array)
        return NULL;
    else {
        unsigned int num_read = 0;
        printf("Enter %u integers so they can be put into this array\n", n);
        while (num_read < n) {
            num_read += scanf("%d", array + num_read);
        }
    }
    return array;
}

/* Add to array */

/* Parameters:
 * arr: Existing array of integers
 * num: number of integers in the array before the call
 * newval: new value to be added
 * 
 * Returns: pointer to the allocated array
 */
int *add_to_array(int *arr, unsigned int num, int newval) {
    int* newarray = realloc(arr, (num+1) * sizeof (int)); //allocate one more space
    if (newarray == NULL) //Return original array if failed to allocate
        return arr;

    //free(arr); //free old array -- this throws an error when i try and free up the old array
    newarray[num] = newval;
    return newarray;
}

int main()
{
    /* testing exercise. Feel free to modify */
    int *array = dyn_reader(5);

    array = add_to_array(array, 5, 10);
    array = add_to_array(array, 6, 100);
    array = add_to_array(array, 6, 1000);

    return 0;
}

如您所见,main函数调用dyn_reader,它分配足够的内存以允许在数组中有n个元素。它从用户读取整数并返回数组。

然后main函数调用add_to_array,它调用足够的内存来在数组中添加一个加法元素。如果它不能,则返回原始数组。如果内存重新分配有效,我将newval添加到数组的末尾。在这种情况下,我使用一个新的指针来存储新重新分配的数组。为什么当我尝试释放旧数组(free(arr);)时,我得到一个错误。那个指针是否仍然指向堆上的内存而不应该释放它?

2 个答案:

答案 0 :(得分:3)

不,如果realloc移动到新的内存区域,那么它会执行&#34; free()&#34;为你(所以请确保你没有任何其他指针指向该数组!)。 C标准说(http://pubs.opengroup.org/onlinepubs/9699919799/functions/realloc.html):

The realloc() function shall deallocate the old object pointed to by ptr

linux手册页(https://linux.die.net/man/3/realloc)使其更明确:

 If the area pointed to was moved, a free(ptr) is done.

答案 1 :(得分:0)

如果重新分配成功,realloc()已处理释放与早期指针相关的内存。请注意,指针可能甚至没有更改。

add_to_array()的另一个问题是调用函数没有任何成功/失败的迹象。