最近使用vs2015編譯ORB-SLAM2的程序,在debug模式下進行調試運行時碰到了堆內存異常,大體報錯內容以下:app
錯誤:File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 980
Expression: __acrt_first_block == header
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
看了網上大牛們的分析,大體能夠歸因於連接錯誤。dll 若是靜態連接了運行時庫,dll 就會擁有獨立於應用程序堆(也稱做local heap)的運行時堆實例。此時在 dll 外部就不能訪問此 local heap,因此也就有上面所出現的異常。函數
檢查了一下代碼中出錯的位置,確實存在這樣的狀況:spa
vector<cv::KeyPoint> vKeysCell;
FAST(mvImagePyramid[level].rowRange(iniY,maxY).colRange(iniX,maxX), vKeysCell,iniThFAST,true);
其中vKeysCell在調用opencv中的FAST函數時,在其內部被分配了空間,而後在FAST函數外面對vKeysCell進行析構時出現了前面的析構錯誤。debug
簡單粗暴的解決辦法是在調用FAST函數以前,先分配好內存空間。調試
vector<cv::KeyPoint> vKeysCell(10000);
這樣就不會報出上面的錯誤了。code
除此以外,還能夠修改庫的連接狀況,這種方法比較麻煩,暫時不作考慮。orm