У меня есть зЬй :: unordered_map как часть глобальной переменной типа структуры:станд :: 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));
}
это -> _ Myhead кажется NULL. Что послужило бы причиной этого?
Использование Microsoft Visual C++ 2010. 0xC0000005: Доступ к обнаружению нарушения доступа 0x00000000 является ошибкой.
EDIT: Вот компилируемый пример:
#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 :: make_pair (..)' лучше использовать 'std :: pair (..) '(если вам нужны явные аргументы шаблона), в противном случае могут возникнуть проблемы с привязкой refval ref. (Как видно в разговоре Стефана Т. Лаваева в Going Native.) ** Примечание: ** Вам даже не нужны явные аргументы шаблона из-за неявных преобразований между типами 'pair'. Это было бы лучшим решением 'std :: make_pair (key, value)'. –
dyp
'typedef struct level_locals_s {..} level_locals_t;' Синтаксис C, и ни один из них не нужен и не особенно полезен или симпатичен в C++. В C++ просто используйте 'struct level_locals_t {..};' – dyp
возможно, вам нужно выделить карту – Dru