我写这段代码:
运行时,行
出错cout<<it2->first;
test3.exe中0x00411edd处的未处理异常:0xC0000005:访问冲突读取位置0x00000004。“
我有Visual Studio Express 2008和Boost 1_47_0;
这是我的完整代码:
#include "stdafx.h"
#include <iostream>
#include <boost/unordered_map.hpp>
using namespace std;
typedef boost::unordered_map<int,int > MAP;
MAP map2;
boost::unordered_map<int,int>::iterator it2;
void gen_random(char *s ,char *p,int* r,const int len);
void inline insert2(int i_key,int i_value);
void print();
//-----------main------------------------------------
void main()
{
char* s_key=new char[8];
char* s_value=new char[8];
int i_value=0, size_random=8;
for(int i=0;i<12;i++)
{
gen_random(s_key,s_value,&i_value,size_random);
insert2(i_value,i_value);
}
print();
int a;
std::cin>>a;
}
//-------------end main--------------------------------
//--------my function ---------------------------
//-------random--------------
void gen_random(char* s,char* p,int *r, const int len) {
static const char alphanum[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
(*r)=rand();
for (int i = 0; i < len; ++i) {
s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
p[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
}
s[len] = 0;
p[len] = 0;
}
//-----end random------------
void inline insert2(int i_key,int i_value)
{
map2.insert(MAP::value_type(i_key,i_value));
}
void print()
{
for(it2=map2.begin();it2 != map2.end();++it2 );
{
cout<<it2->first;
}
}
//--------end function---------------------------
答案 0 :(得分:5)
s [len] = 0; p [len] = 0;
您正尝试将值分配给数组范围之外的s[8]
和p[8]
。它们被声明为char[8]
,因此只能将其从0
索引到7
。
答案 1 :(得分:2)
该行:
for(it2=map2.begin();it2 != map2.end();++it2 );
不应以分号结尾。循环运行,但不会进入其后的代码块。当循环完成时,it2
等于map2.end()
,这就是您尝试使用它时获得访问冲突的原因。
如果您使用较小的范围变量,则可以避免此问题。例如,这会导致编译器错误(假设it2
不再是全局的):
for(boost::unordered_map<int,int>::iterator it2 = map2.begin(); it2 != map2.end(); ++it2);
{
cout<<it2->first;
}