C++ 散列用 new 设置错误的分配

标签 c++ hash linked-list bad-alloc

我正在为学校做一个哈希集项目。我有一个用于链接的“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/

相关文章:

hash - 使用哈希跟踪文件的唯一版本

C - 无法访问内存地址

c++ - 循环逻辑流程

c++ - 如何在 Linux CentOS 上更改默认 GCC 编译器以与 MPI 一起使用

php - 您如何测试两个哈希值(密码)是否相似?

c++ - 为什么我对 pointer->next == NULL 的检查在我的链表中出现错误?

c++ - 为链表创建复制构造函数

Visual Studio 中的 C++ 和 OpenCV 退出并出现代码 -1 (0xffffffff) 错误

c++ - 处理超过 1024 个套接字?

php - Xcode和PHP中的SHA1具有不同的结果