今天调试程序时,在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::map<int,CString> mapTimeInter;
// a.cpp
std::map<int,CString> mapTimeInter;
void initMapTimeInter(void)// 初始化mapTimeInter函数
{
mapTimeInter.insert(std::make_pair(1,"0.1"));
mapTimeInter.insert(std::make_pair(2,"0.2"));
mapTimeInter.insert(std::make_pair(4,"0.5"));
mapTimeInter.insert(std::make_pair(8,"1"));
mapTimeInter.insert(std::make_pair(16,"2"));
mapTimeInter.insert(std::make_pair(32,"5"));
}
// use_a.h
#include "a.h"
// use_a.cpp
use_a::use_a()
{
initMapTimeInter();
}
刚开始弄不明白这到底是何错误,于是试试局部map变量Insert是否会报错?于是在initMapTimeInter()函数中加入了一段测试代码:
void initMapTimeInter(void)// 初始化mapTimeInter函数
{
// 测试代码
std::map<int,int> test;
test.insert(std::make_pair(1,1));
// 测试代码结束
mapTimeInter.insert(std::make_pair(1,"0.1"));
mapTimeInter.insert(std::make_pair(2,"0.2"));
mapTimeInter.insert(std::make_pair(4,"0.5"));
mapTimeInter.insert(std::make_pair(8,"1"));
mapTimeInter.insert(std::make_pair(16,"2"));
mapTimeInter.insert(std::make_pair(32,"5"));
}
以上的map变量test没问题,但将std::map<int,int> test;的定义拿到外面,就出现了同样的问题。
std::map<int,int> test;
void initMapTimeInter(void)// 初始化mapTimeInter函数
{
// 测试代码
test.insert(std::make_pair(1,1));
// 测试代码结束
mapTimeInter.insert(std::make_pair(1,"0.1"));
mapTimeInter.insert(std::make_pair(2,"0.2"));
mapTimeInter.insert(std::make_pair(4,"0.5"));
mapTimeInter.insert(std::make_pair(8,"1"));
mapTimeInter.insert(std::make_pair(16,"2"));
mapTimeInter.insert(std::make_pair(32,"5"));
}
于是猜测是不是因为map变量在调用insert()时,只是声明了下,还并没有实例化?所以会出现错误,于是,将map变量的定义放到insert()函数之前,即将map变量mapTimeInter的定义放到了use_a.cpp中(因为use_a.cpp里调用了mapTimeInter的insert()函数),修改如下:
// a.h
extern std::map<int,CString> mapTimeInter;
// a.cpp
void initMapTimeInter(void)// 初始化mapTimeInter函数
{
mapTimeInter.insert(std::make_pair(1,"0.1"));
mapTimeInter.insert(std::make_pair(2,"0.2"));
mapTimeInter.insert(std::make_pair(4,"0.5"));
mapTimeInter.insert(std::make_pair(8,"1"));
mapTimeInter.insert(std::make_pair(16,"2"));
mapTimeInter.insert(std::make_pair(32,"5"));
}
// use_a.h
#include "a.h"
// use_a.cpp
std::map<int,CString> mapTimeInter;// 从a.cpp中剪切过来的
use_a::use_a()
{
initMapTimeInter();
}
这样调整后,果真运行时insert()就能正常插入数据了,我理解的错误原因是map变量在定义时被分配了存储空间,Insert()时要用到此空间,如果在调用insert()前,只是声明一下map变量,还没有分配空间,所以会产生运行时错误。建议:在调用insert()函数前,必须保证map变量已经被定义,而不仅仅是个声明。在网上找了很多原因,最终还是自己解决了,希望可以帮到遇到有此错误的人!