gpt4 book ai didi

C++、内存和数组。创建我自己的 hashmap 进行练习。内存中遗留了意外数据?

转载 作者:行者123 更新时间:2023-11-27 23:26:54 29 4
gpt4 key购买 nike

所以我正在尝试为我正在尝试学习 C++ 的小项目创建一个非常适合我需要的 hashmap。我有以下代码:

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 文件编译

感谢任何帮助!

最佳答案

您看到的行为是正常的:如果您获取 一个您放入散列中的值,它将由您的main 显示。给您带来惊人结果的是您的哈希函数:

return (long int) dat % 26;

这会散列 dat 指针,而不是 dat 指向的 T。尝试:

return *dat % 26;

(或者只使用标准的 std::set。)

您的代码的另一个问题:

T _hashes[26]; //I want a fixed size here   (a

this->_hashes = new T[26];                   (b

不相容。要么使用固定数组 (a) 而无需分配它 (b),要么使用普通指针 (T *_hashes) 并执行 (b) - 我很惊讶你的编译器接受你所拥有的。如果您使用 (a),则在析构函数中不需要任何内容​​。如果使用 (b),则需要在析构函数中delete []

在 get 中传递一个 T* 而在 set 中传递一个 T 也有点奇怪。

关于C++、内存和数组。创建我自己的 hashmap 进行练习。内存中遗留了意外数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8629807/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com