list.cc:没有这样的文件或目录

时间:2020-10-15 21:51:26

标签: c++ gcc

当我尝试运行以下代码时,出现分段错误:

#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

1 个答案:

答案 0 :(得分:0)

Jerry Coffin解决了这个问题:

乍一看,您似乎真的想在称为储备金的地方调整大小。那可能无法解决您的所有问题,但至少可以为您当前看到的内容提供合理的解释。

我将values.reserve更改为reserve.resize值