2011-10-21 19 views
1

私はを持っており、毎回特定のバイト数で配列を割り当てます。C - ダイナミックアレイのメモリリークのメモリリーク

printfを使用すると、自分のデータがこの配列にロードされていることがわかります。

function1 (other arguments, CvPoint2D32f* array1) 

そしてIはfunction1を呼び出して、別の変数(配列2)に配列1データを割り当てたfunction2があります。

function2(other stuff, CvPoint2D32f* array2) 

私は、私は自分のデータにアクセスすることができないことがわかりますprintfを使用しています。私は3番目の変数にデータを代入する私のメインプログラムによって

function2と呼ばれるプログラムが印刷さ0.000 .. ...

私が検索し、私は検索が、間違っているものを見つけることができません。

ポインタを渡すだけでは十分ではありませんか?私は十分に特異的ではなかった場合

ヘルプ、私に尋ねる:

function1(IplImage* grey, IplImage* image, CvPoint2D32f *array1){ 

    int array_counter = cvFindContours(grey, storage_color, &colorcontoursizeof(CvContour), 
           CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 
    array1 = (CvPoint2D32f*)malloc(array_counter*sizeof(CvPoint2D32f)) 
    if (array_counter == 0){ 
     printf("Error allocating memory or Just a colour missing!!!\n\n\n"); 
     free(Man); 
    } 

    cvReleaseMemStorage(&storage_color); // Releasing memory. 
    free(Man); 

    return array_counter; 
}  


int function2(IplImage* image, CvPoint2D32f *array2, other stuff){ 

    ...other stuff...  

    // Find the contours for the different colors. 
    r_counter = function1(image1, image2, array2); 

    return 0; 
} 

EDIT ========================== =============

私はここに投稿する前にそれをしようとしましたが、ここに問題があります。

非クラス型のCvPoint2D32fについてarray1のデータをロードする行でコンパイルするとエラーが発生します。

私はエラーを取得し、これらの行で何をすべきかです:

array1[cnt].x = (tpt1.x + tpt2.x)/2; 
array1[cnt].y = (tpt1.y + tpt2.y)/2; 

第二EDIT ======================= ==

両方の回答が助けられ、正しいものでした。みんなありがとう!問題は解決された。 私はfunction1からfunction2へ、そしてfunction2からmainプログラムにデータをエクスポートするための両方の関数へのダブルポインタを使用しました。私はたくさんの助けになった一時変数を使いました。それほど混乱はありませんでした。

+1

質問に使用されているのと同様のキーワードを使用している場合、おそらく答えは見つからないでしょう...少なくともコードや何かを投稿してください... –

+0

コードを投稿できますか? – Maciej

+1

今後の質問については、[コードをマークアップする方法](http://stackoverflow.com/editing-help)をご覧ください。 – spraff

答えて

2

(Cポインタ渡しの意味を説明しようとすると、クマシナリオ2トライあなたの「**へのポインタのポインタ」構文「関数1を()」が必要だと思います私と少し)。

Cは値渡しのみを持ちます。つまり、関数の引数を変更することはできません。そうで:

function1(IplImage* grey, IplImage* image, CvPoint2D32f *array1){ 
    .... 
    array1 = (CvPoint2D32f*)malloc(array_counter*sizeof(CvPoint2D32f)) 
    .... 
} 
r_counter = function1(image1, image2, array2); 

あなたはfunction1array1に行われた変更は、(array1が値ではなく、参照によって渡される)、その関数の外には見えません。

function1(IplImage* grey, IplImage* image, CvPoint2D32f **array1){ 
    .... 
    *array1 = (CvPoint2D32f*)malloc(array_counter*sizeof(CvPoint2D32f)) 
    .... 
} 
r_counter = function1(image1, image2, &array2); 

すなわちただ間接の別のレベルを追加します、これを回避機能にあなたが参照渡したい変数へのポインタが含まれていることを、変数を渡すために

。 RFC 1925真理値6a(参照)間接参照の別のレベルを追加することは常に可能です。)。

2

2つのシナリオ:

// SCENARIO 1: Array allocated outside a function and passed into it 
    myfunc (char * buff) 
    { 
    buff[0] = 'A'; 
    ... 

    main() 
    ... 
    char *mybuffer = NULL; 
    if ((mybuffer = malloc (100)) 
     myfunc (mybuffer); 
     ... 

// SCENARIO 2: Array allocated inside of a function and passed out from it 
    myfunc (char **buff) 
    { 
    *buff = malloc (100); 
    ... 

    main() 
    char *mybuffer = NULL; 
    myfunc (&mybuffer); 
    ... 

私は問題はおそらく

+0

ok私はあなたに知らせてくれます。 皆様お返事ありがとうございます ご質問ありがとうございます。 –