0

史前史:我正在创建模板类(HashMap< KeyType, ValueType >),它应该使用哈希表实现映射的抽象。为了解决哈希表中的冲突,使用了链的方法。当我尝试使用构造函数HashMap()初始化main.cpp中的 HashMap 对象时出现错误。

错误:“堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出。”

所以,代码:

私有部分的一部分(仅所有成员变量和方法createBuckets(),在构造函数HashMap()中使用)

private:

/* Constant definitions */

   static const int INITIAL_BUCKET_COUNT = 101;
   static const int MAX_LOAD_PERCENTAGE = 70;

/* Type definition for cells in the bucket chain */

   struct Cell {
      KeyType key;
      ValueType value;
      Cell *next;
   };

/* Instance variables */

   vector<Cell *> buckets;
   int nBuckets;
   int numEntries;

/* Private methods */

/*
 * Private method: createBuckets
 * Usage: createBuckets(nBuckets);
 * -------------------------------
 * Sets up the vector of buckets to have nBuckets entries, each NULL.  If
 * asked to make empty vector, makes one bucket just to simplify handling
 * elsewhere.
 */

void createBuckets(int new_nBuckets) {
    if (new_nBuckets == 0) nBuckets = 1;
    buckets = vector<Cell *>(new_nBuckets, NULL);
    this->nBuckets = new_nBuckets;
    numEntries = 0; 
}
template <typename KeyType, typename ValueType>
HashMap<KeyType, ValueType>::HashMap() {
    createBuckets(INITIAL_BUCKET_COUNT);
}

最奇怪的是错误很少发生,当它没有发生时,类会成功运行。如果我重新编译程序,则没有错误,并且在下一次重新编译之前不会发生。如果重要的话,我会使用 Visual Studia 2017 来编写这个程序。

我想这个问题是由在方法createBuckets中创建向量引起的,但我看不出有任何问题。

4

0 回答 0