私は私がC++を学ぼうとしている小さなプロジェクトのために、私のニーズに合ったハッシュマップを作成しようとしています。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と空行を。私の質問は、なぜこれが起こり、どのように私はそれを防ぐことができますか?それは削除されても、他のプログラムが自由に取れるようにしてから、それを正しく初期化しないと、メモリが「ヌル」にならないようにするものですか? また、時間がある場合は、間違いを指摘してください。そうでないと、コード内のことを行うことができません。
それがg ++ -g file.cpp -o任意の助けのために
感謝を提出し、それをコンパイルし、コンパイルするGCCのDebian 4.4.5-8を使用して、任意の関心イムのなら!
'T _hashes [26]'の代わりに 'std :: array < T , 26> _hashes'を使う方がいいでしょう。また、デストラクタで '_hashes'を削除する必要があります – shuttle87
なぜgetメソッドでT()を返していますか?申し訳ありませんが私はここで非常に明白な何かを理解していない場合。 – Shadow
@ shuttle87私はこの標準クラスについて聞いたこともありませんでした。いくつかのドキュメントへのリンクがありますか?ヒントをありがとう!今すぐ見つけて、それを読んでください! – lfxgroove