2011-06-08 84 views
3

我一直在試圖理解爲什麼下面的代碼給我的字符串「文件名」壞指針:壞PTR時傳遞的字符串引用作爲參數

Mat imread(const string& filename, int flags) { 
    // some code returning a Mat object 
} 

int main() { 
    string s = "test.jpg"; 
    imread(s, 0); 
} 

我已經調試一步一步我所得到的只是在輸入imread之前,字符串沒有問題(我能夠檢查它的每個元素),但之後不可能這樣做,調試器指責Bad Ptr。我不確定我明白爲什麼會發生這種情況。

就這麼你知道,我正在使用Visual Studio 2008和OpenCV 2.2。

編輯:我確實已經忘了說一件重要的事情,那對我來說很重要,它解決了這個問題:我在.cu文件中編寫這段代碼,因此在第一個實例中由nvcc編譯。

+0

「給我一個糟糕的指針」?你發佈的代碼是好的(除了未聲明的「Mat」和缺少返回語句),所以這個問題(無論你是否真的說了)在其他地方。你能發佈一個最小的完整的測試用例來證明這個問題嗎?或者至少有一些來自調試器的輸出? – 2011-06-08 10:11:09

+0

您的應用程序是多線程的嗎? – Nawaz 2011-06-08 10:12:50

+0

opencv已經有一個'imread'函數,你爲什麼試圖重新定義它? – etarion 2011-06-08 10:59:57

回答

0

我解決了這個問題,將不同文件中的所有OpenCV代碼從涉及CUDA擴展的代碼中分離出來。因此,imread現在正從.cpp文件中調用,涉及CUDA的所有內容都在不同的.cu和.h文件中。

糾正我,如果我錯了,但我不認爲這應該是這樣,也許這是一個錯誤。

4

爲本地代碼編寫調試器是一項不平凡的任務。機器代碼與源代碼之間沒有1對1的對應關係。調試人員通常會給出這樣的誤導性信息,但這並不意味着實際值是無效的。還要確保您在打開調試信息的情況下編譯並關閉所有優化。

注意:當你進入一個函數時,棧幀可能還沒有被初始化。再做一步可能會顯示正確的參數。

相關問題