史前史:我正在创建模板类(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中创建向量引起的,但我看不出有任何问题。