如何处理以下代码中的内存分配错误

How can I handle memory allocation errors in the following code?

本文关键字:代码 内存 错误 分配 何处理 处理      更新时间:2023-10-16
const unsigned long long TABLE_SIZE = (1ULL << 34);
class HashMap {
private:
HashEntry** table;
public:
HashMap() {
table = new HashEntry*[TABLE_SIZE]; 
for (int i = 0; i < TABLE_SIZE; i++)
table[i] = NULL;
}
};

编译时的上述代码引发以下异常:"在引发'std::bad_alloc'的实例后调用terminate"what((:std::bad_alloc",而下面的代码没有抛出错误或警告,并且编译正确。

const unsigned long long TABLE_SIZE = 65536;
class HashMap {
private:
HashEntry** table;
public:
HashMap() {
table = new HashEntry*[TABLE_SIZE]; 
for (int i = 0; i < TABLE_SIZE; i++)
table[i] = NULL;
}
};

我认为抛出"bad_alloc"异常是因为系统内存不足。我想知道如何绕过这个问题,让这个代码发挥作用。

根据指针的大小,您的第一个代码块请求128 GB的连续内存(我假设是64位地址,因为您甚至无法在32位地址空间中寻址那么多字节(。这是一种特定的方式,即使在您开始分配HashEntry对象之前,也会导致系统内存不足!

幸运的是,哈希表通常需要更少的bucket:使用模%运算符将哈希代码转换为有效bucket索引的实际范围,然后使用冲突解决算法来处理多个哈希值"映射"到同一bucket的情况。这种方法可以将可能的哈希值的大空间"折叠"到有效哈希索引的小空间中。