今天除錯程式時,在std::map insert(),會產生錯誤中斷,分析過程如下:
定義了乙個全域性的map變數,在a.h中宣告,在a.cpp中定義並定義了初始化函式;在另乙個檔案use_a.cpp中,呼叫map變數初始化函式initmaptimeinter;執行時在maptimeinter.insert(std::make_pair(1,"0.1"));處產生中斷錯誤,定義如下:
// a.h
extern std::mapmaptimeinter;
// a.cpp
std::mapmaptimeinter;
void initmaptimeinter(void)// 初始化maptimeinter函式
// use_a.h
#include "a.h"
// use_a.cpp
use_a::use_a()
initmaptimeinter();
剛開始弄不明白這到底是何錯誤,於是試試區域性map變數insert是否會報錯?於是在initmaptimeinter()函式中加入了一段測試**:
void initmaptimeinter(void)// 初始化maptimeinter函式
以上的map變數test沒問題,但將std::maptest;的定義拿到外面,就出現了同樣的問題。
std::maptest;
void initmaptimeinter(void)// 初始化maptimeinter函式
於是猜測是不是因為map變數在呼叫insert()時,只是宣告了下,還並沒有例項化?所以會出現錯誤,於是,將map變數的定義放到insert()函式之前,即將map變數maptimeinter的定義放到了use_a.cpp中(因為use_a.cpp裡呼叫了maptimeinter的insert()函式),修改如下:
// a.h
extern std::mapmaptimeinter;
// a.cpp
void initmaptimeinter(void)// 初始化maptimeinter函式
// use_a.h
#include "a.h"
// use_a.cpp
std::mapmaptimeinter;// 從a.cpp中剪下過來的
use_a::use_a()
initmaptimeinter();
這樣調整後,果真執行時insert()就能正常插入資料了,我理解的錯誤原因是map變數在定義時被分配了儲存空間,insert()時要用到此空間,如果在呼叫insert()前,只是宣告一下map變數,還沒有分配空間,所以會產生執行時錯誤。建議:在呼叫insert()函式前,必須保證map變數已經被定義,而不僅僅是個宣告。
在網上找了很多原因,最終還是自己解決了,希望可以幫到遇到有此錯誤的人!
執行時異常
常見的幾種如下 nullpointerexception 空指標引用異常 classcastexception 型別強制轉換異常。illegalargumentexception 傳遞非法引數異常。arithmeticexception 算術運算異常 arraystoreexception 向陣列中...
執行時改變控制項大小執行時移動控制項MINICAR版
執行時改變控制項大小執行時移動控制項minicar版 vs2005.net編寫,網上找了找,見別人寫得挺複雜,自己寫了乙個.附件居然不能上傳.就把 發到下面吧,有個奇怪現象就是,vb6中新建工建,拖個picturebox框出來,拷入以下 即可,但vb.net中是不行的.如mousemove事件你必須...
VC執行時庫
vc專案屬性 配置屬性 c c 生成 執行時庫 可以採用的方式有 多執行緒 mt 多執行緒除錯 mtd 多執行緒dll md 多執行緒除錯dll mdd 單執行緒 ml 單執行緒除錯 mld reusable library switch library macro s defined single...