2017-02-21 21 views
0

可能性の重複: OpenCV double free or corruption (out): Aborted (core dumped)ダブルフリーまたは破損(アウト)エラーの原因は何ですか?

私は、クライアントから画像を受信して​​画像を処理し、データを返すために、サーバーでのOpenCVを使用する関数を作成しました。 私は関数を使用した場合にのみこのエラーが発生することを認識しました。無料()。以下は私の関数内のコードです。私はfree(sockData); は私が間違って何をやってコメントを解除するとき

// 2. Create Mat Image 
Mat image = Mat::zeros(height, width, CV_8UC3); 
uchar sockData[imageSize]; 

//Receive Image data here 
printf("Receiving Image Data\n"); 
for (int i = 0; i < imageSize; i += bytecount) 
{ 
    if ((bytecount = recv(*csock, sockData +i, imageSize - i, 0)) == -1) 
    { 
     fprintf(stderr, "Error receiving image %d\n", errno); 
    } 
} 
// deallocate 
deallocateMemory(csock); 

// Image Data Received, Now Reconstructing Image 
printf("Image Data Received, Now Reconstructing\n"); 
int ptr = 0; 
for (int i = 0; i < image.rows; i++) 
{ 
    for (int j = 0; j < image.cols; j++) 
    { 
     image.at<cv::Vec3b>(i,j) = cv::Vec3b(sockData[ptr+0],sockData[ptr+1], 
     sockData[ptr+2]);ptr = ptr + 3; 
    } 
} 
// Write produced output to stdout - Print 
printf("Image Processed, now Displaying Results...\n"); 
displayResultsOnConsole(results); 

// free(sockData); 
return 0; 

エラーが表示されますか?

+1

'uchar sockData [imageSize];'はスタックに割り当てられているので、 'free()'が失敗します。 –

答えて

2

freeに渡すことができるのは、malloc(または何もしないNULL)から取得した同じポインタだけです。このルールを破ると、悪いことが起こります。

+0

ああ、今私は参照してください。 'malloc'を使用したときに' free'しか使用できません。 – Les

+1

権利、または 'strdup'や' realloc'のような同じアロケータから割り当てる他の関数。メモリアロケータはライブラリと似ています。あなたは、まったく同じライブラリからチェックアウトした本のみをチェックインできます。 –

+0

ありがとう:-) – Les

1

Uh。あなたはスタックに割り当てて、ヒープで割り当てを解除したいでしょうか?

スタックに割り当てられたこの大きなチャンクを追加できましたか? - >心配する必要はありません。

これは通常大きいので、画像のバイトをスタックに割り当てるのは悪いことです。 →ヒープに割り当て、ヒープから割り当てを解除する。

+0

あなたはとても正しいです。あなたと@DavidSchwartzのように、私は高解像度の画像を使用したときに失敗しました。私は代わりに 'malloc'を使用しました。ありがとうございました :-) – Les

関連する問題