2013-08-08 4 views
0

У меня есть глобальный unordered_map, где хранятся указатели на struct.Unordered Map return Значение NULL

данных добавляется к карте с помощью обработчика COM событий:

const _bstr_t oTicker(structQuoteSnap.bstrSymbol, false); 
const RecentInfoMap::const_iterator it = mapRecentInfo->find(oTicker); 

RecentInfo* ri; 
if (it == mapRecentInfo->end()) { 
    ri = new RecentInfo;   
    _tcsncpy_s(ri->Name, _countof(ri->Name), oTicker, _TRUNCATE); 

    const size_t tickerLen = oTicker.length() + 1; 
    const LPTSTR ticker = new TCHAR[tickerLen]; 
    _tcsncpy_s(ticker, tickerLen, oTicker, _TRUNCATE); 

    (*mapRecentInfo)[ticker] = ri; 
} else { 
    ri = it->second; 
} 

В другом методе я получаю значение карты путем это ключ:

const RecentInfoMap::const_iterator it = g_mapRecentInfo.find(pszTicker); 
if (it == g_mapRecentInfo.end()) return nLastValid + 1; 
const RecentInfo* const ri = it->second;  

assert(ri != NULL); 

curDateTime.PackDate.Hour = ri->nTimeUpdate/10000; 

А иногда утверждение не удалась, поскольку п является NULL , Я не знаю, почему это происходит. Кажется, что есть действующий код. Пожалуйста, дайте мне предложения.

Есть неупорядоченная карта функторы и определение:

struct KeyHash { 
    size_t operator()(const LPCTSTR&) const; 
}; 

struct KeyEquals { 
    bool operator()(const LPCTSTR&, const LPCTSTR&) const; 
}; 

size_t KeyHash::operator()(const LPCTSTR& key) const { 
    size_t hash = 2166136261U; 
    for (LPCTSTR s = key; *s != _T('\0'); ++s) { 
     hash = (hash^static_cast<size_t>(*s)) * 16777619U; 
    } 
    return hash; 
}; 


bool KeyEquals::operator()(const LPCTSTR& x, const LPCTSTR& y) const { 
    return _tcscmp(x, y) == 0; 
}; 


typedef unordered_map<LPCTSTR, RecentInfo*, KeyHash, KeyEquals> RecentInfoMap; 
+2

Когда это происходит со мной, я всегда с подозрением отношусь к тому, что там есть доступ к rouge [], который инициализирует значение NULL независимо от того, действительно ли оно на карте. – IdeaHat

+1

I второй это. Часто полезно инкапсулировать карту внутри класса, чтобы вы не использовали оператор '[]', вместо этого всегда вызывайте свою функцию поиска. Вы только хотите написать этот код 'find' один раз. – paddy

+0

Вы оба были правы. Использование оператора [] очень опасно, потому что оно ставит новое значение (плохой указатель на мой код) на карту при доступе по ключу, который отсутствует на карте. Теперь мой код работает отлично! –

ответ

0

Вашего хэш-значение зависит от содержания структуры. Вероятно, в какой-то момент вы измените содержание структуры, и это приведет к несогласованности во внутренней структуре unordered_map. Что может привести к странному поведению. Значение хеша не может изменить во времени для того же экземпляра.

+0

Да, я меняю поля структуры, но я не могу понять, почему существует зависимость между хеш-ключом и значением структуры. –