0

我正在为学校做一个哈希集项目。我有一个用于链接的“LinkedList”类型的数组。我在 Mac 上编写代码并使用 clang++ 编译,一切运行正常(内存泄漏,但我会修复)。我遇到的问题是在使用 g++ 的 Ubuntu Linux 上编译时出现错误的分配错误。在 valgrind 中运行时,它表示条件跳转或移动取决于未初始化的值。并说错误来自以下部分:

LinkedList<ItemType>* table;
.
.
.
HashSet () :
    size(0),
    tableSize(0),
    table(new LinkedList<ItemType> [size])
{}

我怀疑错误在于构建表格。如果我将大小更改为 5(或任何其他大于 0 的数字),我会得到相同的错误,换句话说,我认为构造大小为 0 的数组不是问题。有想法该怎么解决这个吗?我的 LinkedList 类中没有复制构造函数,表的初始化是调用复制构造函数还是标准默认构造函数?

4

1 回答 1

2

初始化的顺序不是由构造函数初始化列表中的初始化程序的顺序决定的,而是由在类主体中声明成员的顺序决定的。

如果size在下面声明table,则在内存分配发生后它被初始化为零。到table初始化时,size仍然包含随机垃圾,并且您正在分配一个随机大小的数组。您的代码表现出未定义的行为。

你可以简单地通过编写来解决问题table(new LinkedList<ItemType>[0])。但是,不清楚为什么要首先分配一个大小为零的数组。你认为这对你有什么好处?

与其使用原始数组并手动管理内存,不如考虑使用std::vector<LinkedList>. 而std::list不是本土的LinkedList,很好的衡量标准。

于 2013-08-10T22:18:39.710 回答