Итак, я пытаюсь создать довольно специфичный для моих нужд хэш-карту для небольшого проекта, где я пытаюсь выучить c ++.У меня есть следующий код:
template<class T>
class HashMap
{
public:
HashMap();
virtual ~HashMap();
void add(T value);
T get(T *value);
private:
int hash(T *data);
T _hashes[26]; //I want a fixed size here
};
template<class T>
HashMap<T>::HashMap()
{
for(int i = 0; i < 26; i++)
this->_hashes[i] = T();
}
template<class T>
HashMap<T>::~HashMap()
{
//Don't really have anything to delete here?
}
template<class T>
int HashMap<T>::hash(T *dat)
{
//Super simple, just to try things out
return (long int) dat % 26;
}
template<class T>
T HashMap<T>::get(T *val)
{
int idx = this->hash(val);
cout << idx << endl;
//Probably somewhere here i get my problem
if(this->_hashes[idx])
return this->_hashes[idx];
return T();
}
template<class T>
void HashMap<T>::add(T val)
{
//Should probably do some check if there's already an element here.
this->_hashes[this->hash(&val)] = val;
}
Проблема, с которой я сталкиваюсь, заключается в том, что это нормально компилируется, но когда я делаю что-то подобное в моем файле main.cpp:
HashMap<char> a = HashMap<char>();
a.add('h');
a.add('c');
a.add('g');
char *b = new char {'c'};
cout << a.get(b) << endl;
delete b;
Обычно он возвращаетid, то есть:
4
и пустая строка, которая является просто пустым символом.(выходные данные функции находятся в методе get ()), но иногда мне будет показано что-то вроде этого:
18
g
вместо 18 и пустой строки.У меня вопрос, почему это происходит и как я могу это предотвратить?Это как-то связано с тем, что память не «обнуляется», когда она удаляется, а просто свободна для других программ, и тогда я неправильно инициализирую ее?Кроме того, если у вас есть время, пожалуйста, укажите на какие-либо ошибки или не очень хорошо делать что-то в коде.
Если будет интересно, я использую GCC Debian 4.4.5-8 для компиляции и компиляции с помощью g ++-g file.cpp -o file
Спасибо за любую помощь!