std::map insert运行时错误

本文详细记录了一次在C++中使用std::map时遇到的错误中断问题,通过逐步分析和调整,最终找到并解决了问题的原因。主要关注于map变量在调用insert()函数前是否被正确定义的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天调试程序时,在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变量已经被定义,而不仅仅是个声明。

在网上找了很多原因,最终还是自己解决了,希望可以帮到遇到有此错误的人!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值