2016-07-12 5 views
1

次のコードcv :: Matのdeallocateメソッドは何をしますか? <code>masked.release()</code>が<code>masked.deallocate()</code>によって置き換えられた場合

int main(int argc, char** argv) 
{ 
    cv::Mat1b i1(cv::Size(1, 2)); 
    i1.at<uchar>(0, 0) = 1; 
    i1.at<uchar>(1, 0) = 1; 

    cv::Mat1b mask(i1.size()); 
    mask.at<uchar>(0, 0) = 1; 
    mask.at<uchar>(1, 0) = 0; 

    cv::Mat1b masked; 
    mask.copyTo(masked, mask); 

    masked.release(); //or .deallocate() 
    cout << masked << endl; 
    i1.copyTo(masked, 1 - mask); 
    cout << masked << endl; 
    return 0; 
} 

は非常に動作が異なります。後者の場合、行列maskedはまったく変更されておらず、出力maskedはマスクされたマスクされた行列と反転されたマスクされた行列の合計であり、したがって元のim1行列に等しい。 deallocate()メンバーメソッドは実際に何をしていますか?私はopenCV 3.1を使用します。

+0

[Mat :: release](http://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#ae48d4913285518e2c21a3457017e716e)。 'deallocate()'を呼び出した後にオブジェクトを使うことで、未定義の動作が起こりそうです。 – melak47

+0

私は 'release()'と 'deallocate()'が同じことをすると思います。また、両方ともオブジェクトを「クリア」状態のままにしておく必要があります。 – hovo

+0

ドキュメントでは、 'release()'と 'deallocate()'が同じことをしないことを明確に述べています:) – melak47

答えて

2

deallocate()は、cv::Matから直接データを割り当て解除します。ただし、release()は、cv::Matref_countを減らし、0に達した場合は、deallcoateを単独で呼び出します。

要約:releaseあなたが何をしているかを知るまで、常に使用してください。

いずれかを呼び出す必要はありません。 releaseは、デストラクタ中にcv::Matの間に呼び出されます。

P.S割り当てを解除した後にcv::Matのデータを使用すると、未定義の動作とみなされます。

1

Mat::deallocate()が行列を解放しながら、Mat::release()は参照カウンタを減少させ、必要に応じてマトリックスを解放。参照カウントが0に達するとrelease()を使用すると、Matallは割り当てが解除され、deallocate()は常に割り当てを解除します。詳細情報HERE

関連する問題