У меня есть глобальный 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;
Когда это происходит со мной, я всегда с подозрением отношусь к тому, что там есть доступ к rouge [], который инициализирует значение NULL независимо от того, действительно ли оно на карте. – IdeaHat
I второй это. Часто полезно инкапсулировать карту внутри класса, чтобы вы не использовали оператор '[]', вместо этого всегда вызывайте свою функцию поиска. Вы только хотите написать этот код 'find' один раз. – paddy
Вы оба были правы. Использование оператора [] очень опасно, потому что оно ставит новое значение (плохой указатель на мой код) на карту при доступе по ключу, который отсутствует на карте. Теперь мой код работает отлично! –