因此,我正在尝试为我正在尝试学习 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
感谢您的帮助!