std map insert執行時錯誤

2021-06-17 22:05:56 字數 1385 閱讀 6152

今天除錯程式時,在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...