[問題] QGLViewer 中ptr的傳遞

看板C_and_CPP作者 (睡覺中)時間13年前 (2012/12/23 02:07), 編輯推噓3(307)
留言10則, 4人參與, 最新討論串1/1
開發平台(Platform):VC++ 額外使用到的函數庫(Library Used):QGLViewer 問題(Question): 最近接手了一位畢業學長的程式,有一個bug令我不得其解,說明如下 (參考後面的code): class DeformGUI下有個member mSolver(也是一個class) 當鍵盤事件觸發後,他的記憶體位置不知何故變不一樣,裡頭的member 數值都被洗掉 造成後續程式的錯誤 我跟大家我debug時看見的現象,配搭底下的程式碼: 首先win被宣告出來後,執行loadMesh函式 我跳入函式中選擇斷點,此時看見的 mSolver 狀況如附圖1 http://ppt.cc/ZYlc mSolver有自己的記憶體位置,裡頭的變數也都正常 回到main後,我在底下cout該行停下,此時mSolver的狀況如附圖2 http://ppt.cc/nvEr 亦都正常 然後程式把GUI叫出來,等候鍵盤按下,如圖3 http://ppt.cc/iyzT 鍵盤按下後進入處理函式,此時mSolver的記憶體位置已經不同 (而且都是加1) 裡頭的值也都被洗掉,如附圖4 http://ppt.cc/unli 我不太知道是哪邊出了問題,還請高人指點迷津 程式碼(Code):(請善用置底文網頁, 記得排版) #include <QApplication> #include <DeformGUI.h> #include <OptionParser.h> int main(int argc, char** argv) { OptionParser opt(argc, argv); std::string mesh = opt.getOption<std::string>("-mesh"); QApplication app(argc, argv); DeformGUI win; win.loadMesh( mesh, 10 ); std::cout << "stop here" << std::endl; // COMMON win.show(); win.showEntireScene(); return app.exec(); } DeformGUI.h 中: class DeformGUI : public QGLViewer { .... boost::shared_ptr<GMorpher::Solver> mSolver; ... } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 84.152.45.74 ※ 編輯: paulpaulpaul 來自: 84.152.45.74 (12/23 02:09)

12/23 02:27, , 1F
又到了靈媒除錯法登場的時候了
12/23 02:27, 1F

12/23 02:50, , 2F
this 看看是不是都一樣
12/23 02:50, 2F

12/23 02:51, , 3F
阿沒事 @@
12/23 02:51, 3F

12/23 09:46, , 4F
可以看有沒有鎖定變數改變的功能....(gdb下有) 另外信號的連
12/23 09:46, 4F

12/23 09:46, , 5F
接方式跟設定也可以查一下...看是call到哪些function去了..
12/23 09:46, 5F

12/23 10:38, , 6F
mSolver有生記憶體給它嗎 XD 幹 靈媒除錯太難了啦!!
12/23 10:38, 6F

12/23 18:57, , 7F
乍看之下很像member前後哪個array index用超過加到它吧?
12/23 18:57, 7F

12/23 18:58, , 8F
既然用VC而且this沒變, 就直接用data break point追吧:)
12/23 18:58, 8F

12/23 19:00, , 9F
正確時右邊bp tab右鍵data bp, 把mSolver/px的addr填入,
12/23 19:00, 9F

12/23 19:00, , 10F
然後執行下去看是誰寫那個地方, 大概就抓得到兇手吧@_@"
12/23 19:00, 10F
文章代碼(AID): #1GrVR6kJ (C_and_CPP)