Написах функция за сравнение за std::map, за да мога да имам потребителски типове ключове.
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, но изглежда, че нещо не е наред и не искам да лекувам симптом, а не проблема.
Благодаря
NULL
, това е вмъкването наNULL
ключ, който търсите, НЕNULL
стойност - person Mike Vine   schedule 23.08.2013theKey
за NULL. map::find ще използва вашия компаратор. - person dhavenith   schedule 23.08.2013GGAutoRelease
? - person user2093113   schedule 23.08.2013_map
никъде другаде, напр. с неволно_map[foo]
, къдетоfoo
еNULL
? - person Nate Kohl   schedule 23.08.2013GGString *
обикновено е знак за лош дизайн. Има много малко случаи, в които е полезно да се прави разлика между празен контейнер и никакъв контейнер. Като странична полза,std::map<GGString, GGObject *>
няма да има тези проблеми. - person MSalters   schedule 23.08.2013