C++ 为什么我在尝试推回C+中的项目时会出现seg错误+;?
我正在为我的数据结构类开发一个哈希表实验室。当我在insert函数中使用push_back()函数时,我一直会遇到一个set错误。然而,我不确定是什么导致了这个错误C++ 为什么我在尝试推回C+中的项目时会出现seg错误+;?,c++,hashmap,hashtable,hashcode,C++,Hashmap,Hashtable,Hashcode,我正在为我的数据结构类开发一个哈希表实验室。当我在insert函数中使用push_back()函数时,我一直会遇到一个set错误。然而,我不确定是什么导致了这个错误 using namespace std; HashTable::HashTable(int buckets) { this->buckets = buckets; vector<Entry>* table = new vector<Entry>[buck
using namespace std;
HashTable::HashTable(int buckets) {
this->buckets = buckets;
vector<Entry>* table = new vector<Entry>[buckets];
}
Entry HashTable::insert(GameBoard board, int number) {
int index = compress(board.hashCode());
Entry entry = Entry(board, number);
table[index].push_back(entry);
return entry;
}
int HashTable::compress(int hashCode) {
return (hashCode % buckets);
}
Entry::Entry(GameBoard board, int value) {
this->board = board;
this->value = value;
}
int GameBoard::hashCode() {
int hashVal = 0;
for (int r = 0; r < DIMENSION; r++) {
for (int c = 0; c < DIMENSION; c++) {
hashVal = ((127 * hashVal) + board[r][c]) % 16908799;
}
}
return hashVal;
}
使用名称空间std;
哈希表::哈希表(int bucket){
这个->桶=桶;
向量*表=新向量[桶];
}
条目哈希表::插入(游戏板,整数){
int index=compress(board.hashCode());
条目=条目(板、编号);
表[索引]。推回(条目);
返回条目;
}
int HashTable::compress(int hashCode){
返回(哈希代码%bucket);
}
条目::条目(游戏板,int值){
这个->板=板;
这个->值=值;
}
int GameBoard::hashCode(){
int hashVal=0;
对于(int r=0;r
在问题中显示的代码中:
HashTable::HashTable(int buckets) {
this->buckets = buckets;
vector<Entry>* table = new vector<Entry>[buckets];
}
HashTable::HashTable(int bucket){
这个->桶=桶;
向量*表=新向量[桶];
}
创建一个局部变量
表
,它是指向向量的指针
,然后泄漏内存。然后在HashTable::insert
中尝试访问未初始化的成员变量table
。在问题中显示的代码中:
HashTable::HashTable(int buckets) {
this->buckets = buckets;
vector<Entry>* table = new vector<Entry>[buckets];
}
HashTable::HashTable(int buckets) {
this->buckets = buckets;
vector<Entry>* table = new vector<Entry>[buckets]; // this table is local to this function, also a memory leek.
}
HashTable::HashTable(int bucket){
这个->桶=桶;
向量*表=新向量[桶];
}
创建一个局部变量表
,它是指向向量的指针
,然后泄漏内存。然后在HashTable::insert
中尝试访问未初始化的成员变量table
HashTable::HashTable(int buckets) {
this->buckets = buckets;
vector<Entry>* table = new vector<Entry>[buckets]; // this table is local to this function, also a memory leek.
}
我可以看到您将在insert
方法中push_back()。赛格。发生故障的原因是您要将推回到非斜体表格
您的哈希表
类中是否有向量*表
。如果您已经更改了HashTable::HashTable(int bucket)
以初始化该表,如下所示
HashTable::HashTable(int buckets) {
this->buckets = buckets;
table = new vector<Entry>[buckets]; // Init class attribute `vector<Entry>* table`
}
HashTable::HashTable(int bucket){
这个->桶=桶;
table=newvector[bucket];//Init class属性`vector*table`
}
如果在HashTable
类中没有任何vector*table
,请将其添加到类中并使用上面的HashTable::HashTable(int bucket)
这将解决您的问题
我可以看到您将在insert
方法中push_back()。赛格。发生故障的原因是您要将推回到非斜体表格
您的哈希表
类中是否有向量*表
。如果您已经更改了HashTable::HashTable(int bucket)
以初始化该表,如下所示
HashTable::HashTable(int buckets) {
this->buckets = buckets;
table = new vector<Entry>[buckets]; // Init class attribute `vector<Entry>* table`
}
HashTable::HashTable(int bucket){
这个->桶=桶;
table=newvector[bucket];//Init class属性`vector*table`
}
如果在HashTable
类中没有任何vector*table
,请将其添加到类中并使用上面的HashTable::HashTable(int bucket)
这将解决您的问题。是回拨电话还是[]接线员?我对vector*table=newvector[bucket]的合法性有点模糊代码>,但segfaults通常来自错误的数组索引。hashCode%bucket
不会产生统一的分布,除非bucket
除以可能的哈希数。记住这一点。是时候加载调试器了。(我们不能从这里为您这样做)是回拨电话还是[]接线员?我对vector*table=newvector[bucket]的合法性有点模糊代码>,但segfaults通常来自错误的数组索引。hashCode%bucket
不会产生统一的分布,除非bucket
除以可能的哈希数。记住这一点。是时候加载调试器了。(我们不能在这里为您这样做)谢谢您指出这一点。内存泄漏的确切位置以及如何修复它?很好的捕捉,可能OP隐藏了一个成员表
(似乎他稍后在其他成员函数中使用它)@b如果您已经声明了table
作为类的成员,则只需使用table=new vector[bucket]
,然后不要忘记在析构函数中delete[]table
。@b内存泄漏正是在复制到我的答案的代码中。再次阅读我的答案,但我可以在这里重复:在那里创建一个名为table
的局部变量。@vsoftco解决了这个问题。我在标题中声明了表,这就是导致错误的原因。谢谢谢谢你指出这一点。内存泄漏的确切位置以及如何修复它?很好的捕捉,可能OP隐藏了一个成员表
(似乎他稍后在其他成员函数中使用它)@b如果您已经声明了table
作为类的成员,则只需使用table=new vector[bucket]
,然后不要忘记在析构函数中delete[]table
。@b内存泄漏正是在复制到我的答案的代码中。再次阅读我的答案,但我可以在这里重复:在那里创建一个名为table
的局部变量。@vsoftco解决了这个问题。我在标题中声明了表,这就是导致错误的原因。谢谢