当我尝试运行以下代码时,出现分段错误:
#include <iostream>
#include <list>
#include <vector>
using namespace std;
class HashTable {
private:
vector<list<pair<string,string>>> values;
int cap;
int r = 31;
public:
HashTable(int capacity) {
cap = capacity;
values.reserve(cap);
}
int hashKey(string str) {
int hash = 0;
for (int i=0; i<str.size();i++) {
hash = (r*hash+(int)str[i])%cap;
}
return hash;
}
void put(string key, string value) {
pair<string, string > p(key,value);
values[hashKey(key)].push_back(p);
}
string get(string key) {
list<pair<string,string>> valList = values[hashKey(key)];
if (!valList.empty()) {
for (list<pair<string, string>>::iterator it = valList.begin(); it != valList.end(); it++) {
if (it->first == key) {
return it->second;
}
}
}
return "";
}
bool exists(string str) {
return get(str).empty() ? false : true;
}
};
int main(int argc, char *argv[]) {
HashTable ht(3) ;
ht.put("1234", "325436");
ht.put("gdsgsd", "woqweoqwpe");
ht.put("Mrau", "Bau");
cout << ht.get("1234") << endl;
cout << ht.get("gdsgsd") << endl;
cout << ht.get("Mrau") << endl;
return 0;
}
当我在GDB中调试它时,我得到了:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7e87913 in std::__detail::_List_node_base::_M_hook (this=0x55555556df00, __position=0x55555556deb0)
at /build/gcc/src/gcc/libstdc++-v3/src/c++98/list.cc:132
132 /build/gcc/src/gcc/libstdc++-v3/src/c++98/list.cc: No such file or directory.
我真的没有得到这个错误。据我所知,列表是C ++标准库的一部分。我可以使用标准库中的其他数据结构(例如矢量,地图)。实际上,当我修改上面的代码以删除列表并仅使用vector时,它可以按预期工作。
任何想法为什么会这样?我的gcc安装是否已损坏?我尝试重新安装它,但问题仍然存在(我将其作为gcc pacman软件包安装在arch linux上)。
我不知道这是否有帮助,但是我在下面包括了gdb backtrace:
#0 0x00007ffff7e87913 in std::__detail::_List_node_base::_M_hook (this=0x55555556df00, __position=0x55555556dec8)
at /build/gcc/src/gcc/libstdc++-v3/src/c++98/list.cc:132
#1 0x00005555555567c5 in std::__cxx11::list<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_insert<std::pair<std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&> (this=0x55555556dec8, __position={first = "", second = <error: Cannot access memory at address 0x61>})
at /usr/include/c++/10.2.0/bits/stl_list.h:1912
#2 0x0000555555556216 in std::__cxx11::list<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::push_back (
this=0x55555556dec8, __x={...}) at /usr/include/c++/10.2.0/bits/stl_list.h:1212
#3 0x0000555555555c74 in HashTable::put (this=0x7fffffffe120, key="1234", value="325436") at main.cpp:26
#4 0x000055555555533b in main (argc=1, argv=0x7fffffffe298) at main.cpp:47
答案 0 :(得分:0)
Jerry Coffin解决了这个问题:
乍一看,您似乎真的想在称为储备金的地方调整大小。那可能无法解决您的所有问题,但至少可以为您当前看到的内容提供合理的解释。
我将values.reserve更改为reserve.resize值