2013-10-31 48 views
1

我正在研究OpenCV中的3D稀疏矩陣,當我嘗試調用cv :: SparseMat(http://docs.opencv.org/modules/core/doc/basic_structures.html#sparsemat-release)的發佈方法時,出現此訪問衝突錯誤。釋放SparseMat時發生訪問衝突錯誤

上的OpenCV的內存管理也有一些注意事項:http://docs.opencv.org/modules/core/doc/intro.html#automatic-memory-management

這裏是我的問題的孤立版本:

int main(int argc, char *argv[]) 
{ 
    cv::SparseMat smat2; 

    smat2 = Test(); 
    smat2.release(); //access violation error 
} 

cv::SparseMat Test() 
{ 
    const int sizes[] = {480, 640, 3000}; 
    cv::SparseMat mat(3, sizes, CV_8SC1); 
    return mat; 

} 

而發生錯誤的內部代碼是:

inline void SparseMat::release() 
{ 
    if(hdr && CV_XADD(&hdr->refcount, -1) == 1) 
     delete hdr; // <--- HERE! 
    hdr = 0; 
} 

這是對於我來說,有一段時間內存管理和C++。任何幫助深表感謝。謝謝。

+0

它在*'release()'被調用後發生,正確的,即當'smat2'超出範圍時? – thokra

+0

是的,當我在'inline void SparseMat :: release()'函數中調用'release()'的時候會發生這種情況。 – emredog

+0

當你用'cv :: SparseMat smat2 = Test();'替換'smat2 = Test();'時會發生同樣的情況嗎? – thokra

回答

0

這與我錯誤配置OpenCV的動態庫有關。當我複製正確的dll(\ Release下的opencv_core245.dll,\ Debug下的opencv_core245d.dll等)問題解決了。

儘管如此,我將%PATH%變量更改爲包含C:\opencv\build\x64\vc11\bin文件夾,其中同時包含發行版和調試DLL,但我不得不手動將dll文件複製到相應的項目文件夾。

1

問題是:「const int sizes []」。這意味着你正在函數Test()中的堆棧上(而不是在堆上)創建數組。當您離開該功能時它會自動取消分配,因此稍後嘗試釋放該內存將導致異常。實際上,任何釋放堆棧內存的嘗試都是「有問題的」。

+0

不,這不是問題。 'sizes'數組與'cv :: SparseMat'的內部分配無關。它只是指定矩陣的尺寸的大小。代碼是正確的。 – sgarizvi

+0

呃,我的不好。不知何故,我認爲你傳遞'尺寸'作爲指向數據的指針,而不是矩陣尺寸的定義。我測試了你的代碼,它運行正常。你使用的是什麼操作系統? –

+0

那麼,OP將能夠告訴我,因爲我沒有問這個問題:p – sgarizvi

0

要解決此問題,您需要鏈接到正確的庫opencv_world320.lib如果您正在構建發佈版本。或opencv_world320d.lib如果您正在構建一個調試版本(這假定版本3.2.0OpenCV)。