2016-12-02 8 views
0

私の2次元動的配列を使って別の2次元動的配列を作成し、最初の配列の値を書き換える関数を呼び出すとします。私は私が総ヒープ使用率を取得valgrind --leak-check=yesでそれを確認した場合2次元配列を書き直すときにメモリリークが発生する

#include <stdio.h> 
#include <stdlib.h> 

int **bigger(int **A) 
{ 
    int i; 
    int **A2 = (int **)malloc(10 * sizeof(int *)); 

    for(i = 0; i < 10; i++) 
     A2[i] = (int *)malloc(10 * sizeof(int)); 

    return A2; 
    } 

int main(void) 
{ 
    int i; 
    int **A = (int **)malloc(5 * sizeof(int *)); 

    for(i = 0; i < 5; i++) 
     A[i] = (int *)malloc(5 * sizeof(int)); 

    A = bigger(A); 

    for(i = 0; i < 10; i++) 
     free(A[i]); 

    free(A); 

    return 0; 
} 

:6つのallocs、3を解放し、割り当てられた240のバイトをので、コードは次のようなものです。どのようにしてこのメ​​モリリークを解決できますか?

+1

ようこそスタックオーバーフロー! ['malloc()'と 'C 'のファミリーの戻り値をキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

答えて

4

TL:DR、あなたがを上書きだ、再書き込みじゃありません。

問題がbigger()関数内

A = bigger(A); 

である、あなたは、このようにそれらをレンダリング、あなたが以前に割り当てられたメモリへのポインタを失う可能おり、バックAに同じを格納し、その後、新しい思い出を割り当てている到達不能であり、free() -dではありません。それらはここで漏れを引き起こす。

malloc()メモリ領域のサイズを変更するには、realloc()を使用する必要があります。

malloc()にもう一度電話する前に、bigger()の中にfree()という利用可能なメモリがあります。

+0

しかし、私は私の関数で元の配列の別のコピーが必要な場合、問題を解決するには、AとA2と言うと、私は私の仕事をし、私はA2を返しますか? –

+0

@MihaiPodaru私はあなたの質問を得ていない、あなたは精巧にできますか? –

関連する問題