1

我有一个 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->_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));
}
4

1 回答 1

7

正是因为这条线

memset(&level, 0, sizeof(level));

level_locals_s即使您将其声明为 C 方式(typedef 结构),它也不是 POD 类型,因此调用memset它会以意想不到的方式破坏程序(也许这是未定义的行为?)

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

看来你是 C 出身,对 C++ 有很多误解。顺便说一句,函数的签名main应该是int main(int, char **)

于 2013-09-17T03:06:00.387 回答