2016-12-11 3 views
0

は、だから私はこのコードを持っている:あなたが見ることができるようになぜ再配置するときにヒープからメモリを解放する必要がありますか?

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

を、主な機能は、アレイ内のn個の要素があることができるようにするための十分なメモリを割り当てdyn_readerを呼び出します。ユーザーから整数を読み込み、配列を返します。

次にmain関数はadd_to_arrayを呼び出し、配列内に1つの加算要素を追加するのに十分なメモリを再配置します。それができなければ、元の配列を返します。メモリの再割り当てが機能するならば、配列の最後にnewvalを追加します。この場合、私は新しいポインタを使用して、新たに再割り当てされた配列の格納場所を格納しています。どうすれば古い配列(free(arr);)を解放しようとすると、エラーが出ます。そのポインタはまだヒープ上のメモリを指していないと私はそれを解放すべきではありませんか?

+0

Reallocは、メモリを移動して拡張できるようにした場合、成功した場合に古い割り当てを割り当て解除します。 – koper89

+1

'realloc'は新しい量のメモリを割り当て、成功した場合は元のメモリブロックをコピーして元のブロックを解放し、最後に新しいメモリブロックへのポインタを返します。成功しない場合、NULLを返しますが、元のメモリは元のままです。 –

+1

reallocは、別のアドレスに移動せずに割り当てを拡張するだけであれば、戻り値として同じポインタを与えることができます。したがって、free(arr)によって新しい割り当て済みメモリを解放します。 – koper89

答えて

3

いいえ、reallocが新しいメモリ領域に移動した場合は、 "free()"が実行されます(その配列を指すポインタがないことを確認してください)。 C標準は、(http://pubs.opengroup.org/onlinepubs/9699919799/functions/realloc.htmlで)言う:

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

https://linux.die.net/man/3/reallocで)、Linuxのmanページは、それがより明確になります:

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

概念的には、成功した 'realloc' **常に**は古いメモリを解放し、古いものと新しいサイズの最小値まで同じ内容の新しいメモリを返します。新しいメモリが同じアドレスを持つ場合は、実装の詳細です。 –

0

再割り当てが成功した場合、realloc()は以前に関連するメモリを解放扱っていますポインタ。 ポインタが変更されていない可能性があります。

add_to_array()のもう1つの問題は、呼び出し元関数に成功/失敗の兆候がないことです。

関連する問題