Я написал функцию сравнения для std :: map, чтобы у меня были пользовательские типы ключей.std :: map compare function и NULL
std::map<GGString *, GGObject *, GGDictionaryMapCompare> _map;
...
class GGDictionaryMapCompare
{
public:
bool operator()(GGString * lhs, GGString * rhs)
{
return strcmp(lhs->str(), rhs->str()) < 0;
}
};
код, который добавляет элементы:
GGObject *GGDictionary::addKeyObject(GGString *theKey, GGObject *theObject)
{
if (theKey == NULL || theObject == NULL)
return NULL;
_map.insert(std::pair<GGString *, GGObject *>(theKey, theObject));
return theObject;
}
код, который вызывает сбой:
GGObject *GGDictionary::objectForKey(GGString *theKey)
{
if (theKey == NULL)
return NULL;
std::map<GGString *, GGObject *, GGDictionaryMapCompare>::iterator ii = _map.find(theKey);
if (ii == _map.end())
return NULL;
return GGAutoRelease(ii->second);
}
Стек след:
#0 0x00009f15 in GGString::str()
#1 0x0004a4c4 in GGDictionaryMapCompare::operator()(GGString*, GGString*)
#2 0x0004a3d3 in std::_Rb_tree<GGString*, std::pair<GGString* const, GGObject*>, std::_Select1st<std::pair<GGString* const, GGObject*> >, GGDictionaryMapCompare, std::allocator<std::pair<GGString* const, GGObject*> > >::find(GGString* const&)
#3 0x00049b04 in std::map<GGString*, GGObject*, GGDictionaryMapCompare, std::allocator<std::pair<GGString* const, GGObject*> > >::find(GGString* const&)
#4 0x00048ec9 in GGDictionary::objectForKey(GGString*)
Проблема в том, что LHS приходит в NULL. Я никогда не вставляю NULL в карту, поэтому этого не должно происходить. Любая идея почему? Или я просто выполняю функцию сравнения неправильно? Я могу защитить от получения NULL, но кажется, что что-то не так, и я не хочу вылечить симптом, а не проблему.
Благодаря
Показать, где вы добавляете элементы. – imreal
Не могли бы вы разместить какой-то код о том, как вы используете это, и/или как вы добавляете элементы на карту? Я мог бы попытаться воспроизвести проблему. Я не вижу никаких очевидных проблем с этим кодом, поэтому, возможно, это что-то странное в реализации. –
Если вы GGString входите в 'NULL' свою вставку' NULL' * ключ *, который вы ищете, а не значение «NULL' * * –