1

I have a std::unordered_map as part of a global variable of a struct type:

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

The program crashes upon the insert. I have checked, and the key/value are correct. Here's where it crashes:

iterator begin()
{   // return iterator for beginning of mutable sequence
    return (iterator(this->_Nextnode(this->_Myhead), this));
}

this->_Myhead appears to be NULL. What would be the cause of this?

Using Microsoft Visual C++ 2010. 0xC0000005: Access violation reading location 0x00000000 is the error.

EDIT: Here is a compilable example:

#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 に答える