C++ 试图创建类的对象的基于堆栈的缓冲区溢出

C++ 试图创建类的对象的基于堆栈的缓冲区溢出,c++,buffer-overrun,C++,Buffer Overrun,史前:我正在创建模板类(HashMap),它应该使用哈希表实现映射的抽象。为了解决哈希表中的冲突,使用了链的方法。尝试使用构造函数HashMap()初始化main.cpp中的HashMap对象时出错 错误:“堆栈cookie检测代码检测到基于堆栈的错误 缓冲区溢出。” 因此,守则: 私有部分的一部分(仅所有成员变量和方法createBucket(),在构造函数HashMap()中使用) private: /*恒定定义*/ 静态常数int初始桶计数=101; 静态常数int最大负载百分比=70;

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

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

因此,守则:

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

private:
/*恒定定义*/
静态常数int初始桶计数=101;
静态常数int最大负载百分比=70;
/*铲斗链中单元格的类型定义*/
结构单元{
键型键;
值类型值;
单元格*下一个;
};
/*实例变量*/
矢量桶;
国际nBuckets;
国际货币基金组织;
/*私有方法*/
/*
*私有方法:createBucket
*用法:创建bucket(nBuckets);
* -------------------------------
*设置存储桶向量,使其具有nBuckets条目,每个条目为空。如果
*要求生成空向量,生成一个桶只是为了简化处理
*其他地方。
*/
void createbucket(int new_nBuckets){
如果(new_nBuckets==0)nBuckets=1;
bucket=vector(新buckets,空);
此->nBuckets=新的\u nBuckets;
数值=0;
}
模板
HashMap::HashMap(){
创建桶(初始桶计数);
}
最奇怪的是,错误很少发生,当它没有发生时,类成功地工作。如果我重新编译程序,就不会有错误,直到下一次重新编译才会发生。如果有关系的话,我用Visual Studia 2017来写这个程序

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

最奇怪的是,错误很少发生,当它没有发生时,类就成功地工作了这意味着你的程序不能正常工作。其次,当
向量
已经知道桶的数量时,为什么需要
nBuckets
变量?第三,C++没有这样的工作,崩溃的地点是问题的原因。在调用该函数之前,程序可能已损坏。其次,当
向量
已经知道桶数时,为什么需要nBuckets变量?--我想,你的意思是我们可以使用向量sisie()来找到桶的数量,但是我认为使用变量nBukes是更好的方法,因为它增加了代码的可读性。也许我不对。第三,C++没有这样的工作,崩溃的地点是问题的原因。在调用该函数之前,程序可能已损坏。-我只在MIN .CPP中初始化,同样的错误也会发生。但是我认为使用变量NBUKES是更好的方法,因为它增加了代码的可读性。不,代码的可读性不强。每个程序员都知道什么是
vector::size()
返回的,并且总是正确的。我们不知道nBuckets将返回什么,甚至不知道它是否正确更新。所有额外的变量都会增加bug发生的可能性。如果有的话,添加一个函数
getNumBuckets
或类似的函数,返回
vector::size()
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);
}