我有一个std :: unordered_map作为结构类型的全局变量的一部分:
typedef struct level_locals_s {
std::unordered_map<std::string, std::string> spawnVars;
...
} level_locals_t;
level_locals_t level;
...
...
void AddSpawnFields( char *key, char *value ) {
level.spawnVars.insert(std::make_pair<std::string, std::string>(key, value);
}
程序在插入时崩溃。我检查了,键/值是正确的。这是崩溃的地方:
iterator begin()
{ // return iterator for beginning of mutable sequence
return (iterator(this->_Nextnode(this->_Myhead), this));
}
this-&gt; _Myhead似乎是NULL。这是什么原因?
使用Microsoft Visual C ++ 2010. 0xC0000005:访问冲突读取位置0x00000000是错误。
编辑:这是一个可编辑的例子:
#include <stdio.h>
#include <string>
#include <unordered_map>
using namespace std;
typedef struct level_locals_s
{
unordered_map<string, string> spawnArgs;
} level_locals_t;
level_locals_t level;
void main(char **args, int argc)
{
string st1 = "key";
string st2 = "value";
memset(&level, 0, sizeof(level));
level.spawnArgs.insert(pair<string, string>(st1, st2));
}
答案 0 :(得分:5)
正是因为这条线
memset(&level, 0, sizeof(level));
level_locals_s
即使你将它声明为C-way(typedef结构)也不是POD类型,因此在其上调用memset
会以意想不到的方式破坏程序(可能是未定义的行为) ?)
在C ++中,非POD类型通过调用它们的构造函数来初始化,构造函数将执行各种初始化,如分配内存。将它们归零不是正确的初始化方式。
您似乎来自C背景,对C ++有很多误解。顺便说一句,main
函数的签名应为int main(int, char **)