C++ std::无序的_映射引发未处理的异常

C++ std::无序的_映射引发未处理的异常,c++,C++,我有一个std::unordered_映射作为结构类型的全局变量的一部分: 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 ) {

我有一个std::unordered_映射作为结构类型的全局变量的一部分:

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);
}

此->\u Myhead似乎为空。这是什么原因

使用微软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));
}
#包括
#包括
#包括
使用名称空间std;
类型定义结构级别
{
无序的_映射产卵参数;
}级别(t);;
级别\u本地人\u t级别;
void main(字符**args,整数argc)
{
字符串st1=“key”;
字符串st2=“值”;
memset(&level,0,sizeof(level));
level.spawnArgs.insert(成对(st1,st2));
}

这是因为这一行

memset(&level, 0, sizeof(level));
level\u locals\u s
不是POD类型,即使您将其声明为C-way(typedef struct),因此对其调用
memset
将以意外的方式中断程序(可能是未定义的行为?)

在C++中,非POD类型通过调用它们的构造函数初始化,它们将像分配内存一样进行各种初始化。将它们归零不是正确的初始化方式


<>你似乎来自C背景,对C++有很大的误解。顺便说一下,
main
函数的签名应该是
intmain(int,char**)

这是因为这一行

memset(&level, 0, sizeof(level));
level\u locals\u s
不是POD类型,即使您将其声明为C-way(typedef struct),因此对其调用
memset
将以意外的方式中断程序(可能是未定义的行为?)

在C++中,非POD类型通过调用它们的构造函数初始化,它们将像分配内存一样进行各种初始化。将它们归零不是正确的初始化方式



<>你似乎来自C背景,对C++有很大的误解。顺便说一句,
main
函数的签名应该是
intmain(int,char**)
std::make_pair(..)
更好地使用
std::pair(..)
(如果需要显式模板参数),否则可能会遇到右值引用绑定问题。(如Stephan T.Lavavej在“使用本机”上的演讲所示)注意:您甚至不需要显式的模板参数,因为to
pair
类型之间存在隐式转换。这将是最好的解决方案
std::make_pair(key,value)
typedef结构级别\u locals\u s{..}级别\u locals\t这是C语言的语法,C++中既不需要也不特别有用或漂亮。在C++中,只使用<代码> StuttLeaveLoopsS{{}};代码>可能您需要分配map@Dru默认构造如何?“this->\u Myhead似乎为空。这是什么原因?”是
level
一个全局变量,您是否试图在加载时访问它?
std::make\u pair(…)
更好地使用
std::pair(…)
(如果需要显式模板参数)否则,您可能会遇到右值引用绑定的问题。(如Stephan T.Lavavej在“使用本机”上的演讲所示)注意:您甚至不需要显式的模板参数,因为to
pair
类型之间存在隐式转换。这将是最好的解决方案
std::make_pair(key,value)
typedef结构级别\u locals\u s{..}级别\u locals\t这是C语言的语法,C++中既不需要也不特别有用或漂亮。在C++中,只使用<代码> StuttLeaveLoopsS{{}};代码>可能您需要分配map@Dru默认构造如何?“->\u Myhead似乎为空。这是什么原因?”是
level
一个全局变量,您是否尝试在加载时访问它?+1,但也许您应该提到,(默认)ctor是自动调用的。谢谢。我将使用结构构造函数来适当地处理这种情况,而不是使用memset,因为不需要显式的构造函数或构造函数调用。编译器会自动为您的
struct-level\u-locals\u-s
生成一个默认构造函数,并在动态初始化期间为全局
level
调用它。只需去掉
memset
,它就应该可以工作了。在游戏中,关卡中的东西会随着关卡的变化而清除,所以我需要以某种方式清除它。可能是通过某种方法。我指的是一种用于level_locals_s的方法,不是用于无序的_map+1,但也许你应该提到(默认)ctor是自动调用的。谢谢。我将使用结构构造函数来适当地处理这种情况,而不是使用memset,因为不需要显式的构造函数或构造函数调用。编译器会自动为您的
struct-level\u-locals\u-s
生成一个默认构造函数,并在动态初始化期间为全局
level
调用它。只需去掉
memset
,它就应该可以工作了。在游戏中,关卡中的东西会随着关卡的变化而清除,所以我需要以某种方式清除它。也许是通过某种方法。我指的是一种水平的方法,而不是无序的地图