2010-12-11 4 views
1

Je suis nouveau sur hash_map en C++. Je dois convertir une table en hashmap.hash_map plantant lors de la première recherche lorsque la taille est nulle

Voilà comment je l'ai déclaré et l'utilisation hash_map dans mon programme

J'utilise Microsoft Visual Studio.

#include <hash_map> 
using namespace stdext; 
typedef hash_multimap <const char*, long > HEAPTABLE; 

typedef HEAPTABLE::iterator HEAP_ITER; 

class CTest 
{ 

public: 

void setSwitchID(long i); 
long getSwitchID(); 
void isUpgrading(bool bTest); 
private: 

HEAPTABLE m_hashMap; 
}; 

void CTest::setSwitchID(long dwID) 
{ 


HEAP_ITER hIter = m_hashMap.find("SwitchId"); 
if (hIter != m_hashMap.end()) 
{ 
    hIter->second = dwID; 
} 
else 
{ 
    m_hashMap.insert(make_pair("SwitchId", dwID)); 
} 

} 

long CTest::getSwitchID() 
{ 

HEAP_ITER hIter = m_hashMap.find("SwitchId"); 
if (hIter != m_hashMap.end()) 
{ 
    return hIter->second; 
} 
return 0; 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    CTest* test = new CTest; 
      if (test) 
      { 

    test->setSwitchID((DWORD)i); 
    test->isUpgrading(false); 
     } 
delete test; 
return 0; 

} 

Ce code fonctionne très bien quand je le lance comme un programme distinct mais lorsque je tente l'exécuter dans le cadre de mon projet, l'application se bloque. Même s'il n'y a pas d'entrée dans la carte, le hIter de la fonction set renvoie un mauvais pointeur. Est-ce à cause de la corruption de memeory? S'il te plait peux-tu aider?

S'il s'agit d'une corruption de tas, comment puis-je éviter cela? Y at-il de toute façon je peux dire créer un hash_map avec cette taille?

+0

Avez-vous besoin d'utiliser 'hash_map' (ou l'un des conteneurs non standard)? Ne pouvez-vous pas simplement utiliser 'std :: map'? – birryree

+0

Notez que hash_map est uniquement Microsoft Visual Studio, vous pouvez envisager d'apprendre le unordered_map pour le futur standard. – unsym

Répondre

5

hash_multimap <const char*, long > ne fait pas ce que vous pensez qu'il fait. La clé est un pointeur pas une chaîne. Votre petit programme fonctionne par chance de compilateur en utilisant la même mémoire pour les deux littéraux de chaîne "SwitchId". Ce n'est pas le cas dans un projet plus vaste.

Utilisez plutôt std::string comme clé et, pendant que vous êtes ici, passez à std::unordered_multimap.

+0

J'ai essayé unordered_multimap avec std :: string comme clé, mais l'application plante toujours. Je ne définis aucun allocateur. La classe qui contient le may est allouée dynamiquement, est-ce que je pourrais écraser la mémoire? – mithuna

+0

"se bloque toujours" est trop large d'un diagnostic. Lisez un livre sur C++, essayez un débogueur, publiez du code mis à jour. –

Questions connexes