我正在为学校做一个哈希集项目。我有一个用于链接的“LinkedList”类型的数组。我在 Mac 上编写了我的代码并使用 clang++ 进行了编译,一切都运行良好(存在内存泄漏,但我会修复这些问题)。我遇到的问题是在 Ubuntu Linux 上使用 g++ 进行编译时出现错误的分配错误。在 valgrind 中运行时,它表示条件跳转或移动取决于未初始化的值。并说错误来自以下部分:
LinkedList<ItemType>* table;
.
.
.
HashSet () :
size(0),
tableSize(0),
table(new LinkedList<ItemType> [size])
{}
我怀疑是在构建表格时出错了。如果我将大小更改为 5(或任何其他大于 0 的数字),我会得到相同的错误,换句话说,我不认为构建大小为 0 的数组是问题所在。有想法该怎么解决这个吗?我的 LinkedList 类中没有复制构造函数,表的初始化调用复制构造函数还是标准默认构造函数?
最佳答案
初始化的顺序不是由构造函数初始化列表中初始化器的顺序决定的,而是由类主体中声明成员的顺序决定的。
如果size
声明如下 table
,然后在内存分配发生后将其初始化为零。到时候table
正在初始化,size
仍然包含随机垃圾,并且您正在分配一些随机大小的数组。您的代码表现出未定义的行为。
您只需编写 table(new LinkedList<ItemType>[0])
即可解决问题。 .但是,不清楚为什么首先要分配一个大小为零的数组。你认为这对你有什么好处?
与其使用原始数组和手动管理内存,不如考虑使用 std::vector<LinkedList>
.和 std::list
而不是本土LinkedList
, 很好的衡量标准。
关于C++ 散列用 new 设置错误的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18166818/