1

OpenCV でメモリを解放する際に問題が発生しました。返されたポインタのメモリを解放するにはどうすればよいですか?

これが私のコードです:

これは、関数間引きを呼び出す関数です。

int preprocessing_and_classification() { 

/// Section 2D - Perform morphological processing 

            CvMat* image1_edge_morpho = thinning(image1_edge); 
                        ....... 
                        ....... 
                        ........... 

                        //////////////// release the memory /////////////// 
            cvReleaseImage(&img); 
            cvReleaseMat(&image1); 
            cvReleaseMat(&image1_edge); 
            cvReleaseMat(&image1_edge_morpho); 
            cvReleaseImage(&imgg); 
            cvReleaseImage(&imggT); 
            cvReleaseMemStorage(&g_storage); 
            cvReleaseMat(&features); 
            cvReleaseMat(&labels_obtained); 
            ///////////////////////////////////////////////////// 
return num_bacilli; 

} 

以下に示す関数 thinning は Pointer Merode を返します。

CvMat* thinning(CvMat* M){ 

/* 
Input parameters 
CvMat* M = Pointer to the matrix on which morphological processing needs to be done. 

Output parameters 
CvMat* Merode = Pointer to morphological processed matrix. 
*/ 



    CvMat* Merode = cvCreateMat(h,w,CV_8UC1); 
    . 
    . 
    . 
    . 
    . 
    . 



    ///// Releasing the images, matrices and structuring elements to free memroy. 
   // Matrix Merode is not released as it is the output of this function file 
    cvReleaseStructuringElement(&B); 
    cvReleaseMat( &Mopen ); 
    cvReleaseMat( &temp ); 
    cvReleaseMat( &Mclose ); 
    cvReleaseMat( &temp1 ); 
    cvReleaseMat( &MM ); 
    cvReleaseImage( &img1 ); 
    cvReleaseMemStorage(&g_storage); 
    cvReleaseMat( &Mimg1 ); 
    cvReleaseMat( &Mimg2 ); 


    return Merode; 
} 

どうすればメロードを削除できますか?

4

1 に答える 1

0

thinning使用できる関数を変更することが許可されている場合は、cv::Matまたはcv::Ptr<cvMat>(または、std::unieue_ptrまたはstd::shared_ptrカスタム デリーターを使用して - C++11 互換コンパイラの場合)

コードを変更することが許可されていない場合は、メソッドを使用している場所で戻りポインターを削除する必要があります。最も簡単な方法は、ポインターを でラップすることcv::Ptr<>です。

于 2012-07-19T07:03:49.003 に答える