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

时间:2018-07-25 18:21:40

标签: c++ memory-management

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'实例后调用终止   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”异常。我想知道如何解决此问题以使此代码正常工作。

1 个答案:

答案 0 :(得分:2)

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

幸运的是,哈希表通常需要的存储桶要少得多:使用模数%运算符将哈希码转换为有效存储桶索引的实际范围,然后使用冲突解决算法来处理多个哈希值“映射”到同一存储桶。这种方法使您可以将大量可能的哈希值“折叠”到较小的有效哈希索引空间上。