因此,我试图从头开始用自定义哈希函数构建哈希表,但在测试插入函数时遇到了分段错误问题。如果我正确地读取了gdb输出,那么在我的wn_to_pool函数中尝试对布尔向量进行推回时就会出现问题(取一个整数并将其转换为布尔向量(。我试着调试这个问题已经有一段时间了,但还没有找到解决方案。如果有任何帮助,我们将不胜感激,如果有必要,我可以用调试中引用的其余代码更新帖子。提前谢谢。
没有新操作员的GDB输出
Program received signal SIGSEGV, Segmentation fault.
0x000055555555668b in std::vector<bool, std::allocator<bool> >::push_back (this=0x0, __x=false) at /usr/include/c++/9.2.0/bits/stl_bvector.h:955
955 if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr())
(gdb) bt
#0 0x000055555555668b in std::vector<bool, std::allocator<bool> >::push_back (this=0x0, __x=false) at /usr/include/c++/9.2.0/bits/stl_bvector.h:955
#1 0x0000555555556302 in HashTable<int, int>::wn_to_bool (this=0x7fffffffe3f0, wn=2) at Data_Structures/Hash_Table.cpp:186
#2 0x0000555555556230 in HashTable<int, int>::hashfct (this=0x7fffffffe3f0, key=2) at Data_Structures/Hash_Table.cpp:146
#3 0x0000555555556163 in HashTable<int, int>::insert (this=0x7fffffffe3f0, key=2, value=3) at Data_Structures/Hash_Table.cpp:53
#4 0x0000555555555b0f in main (argc=1, argv=0x7fffffffe4f8) at main.cpp:16
新操作员的GDB输出
Program received signal SIGABRT, Aborted.
0x00007ffff7ab8f25 in raise () from /usr/lib/libc.so.6
(gdb) bt
#0 0x00007ffff7ab8f25 in raise () from /usr/lib/libc.so.6
#1 0x00007ffff7aa2897 in abort () from /usr/lib/libc.so.6
#2 0x00007ffff7b03758 in __malloc_assert () from /usr/lib/libc.so.6
#3 0x00007ffff7b05f6f in sysmalloc () from /usr/lib/libc.so.6
#4 0x00007ffff7b06d32 in _int_malloc () from /usr/lib/libc.so.6
#5 0x00007ffff7b07e84 in malloc () from /usr/lib/libc.so.6
#6 0x00007ffff7e47cba in operator new (sz=40) at /build/gcc/src/gcc/libstdc++-v3/libsupc++/new_op.cc:50
#7 0x000055555555633d in HashTable<int, int>::wn_to_bool (this=0x7fffffffe3f0, wn=2) at Data_Structures/Hash_Table.cpp:181
#8 0x0000555555556230 in HashTable<int, int>::hashfct (this=0x7fffffffe3f0, key=2) at Data_Structures/Hash_Table.cpp:146
#9 0x0000555555556163 in HashTable<int, int>::insert (this=0x7fffffffe3f0, key=2, value=3) at Data_Structures/Hash_Table.cpp:53
#10 0x0000555555555b0f in main (argc=1, argv=0x7fffffffe4f8) at main.cpp:16
wn_to_tool函数(请注意,v最初是一个空向量,因此插入函数将不起作用(
template <typename K, typename V> std::vector<bool>* HashTable<K,V>::wn_to_bool(long wn)
{
std::vector<bool>* v;
while(wn != 0)
{
if(wn % 2 == 0)
v->push_back(false);
else
v->push_back(true);
wn = wn / 2;
}
return v;
}
请注意,v最初是一个空向量
不是。这是一个统一的指针。看不到实际的矢量。
不要使用原始指针。
抛开这样一个函数的效用不谈,这里有一种编写它的方法
template <typename K, typename V>
std::vector<bool> // no pointer
HashTable<K,V>::wn_to_bool(long wn)
{
std::vector<bool> v; //no pointer
while(wn != 0)
{
if(wn % 2 == 0)
v.push_back(false);
else
v.push_back(true);
wn = wn / 2;
}
return v;
}
因此插入功能将不起作用(
insert
与空向量(例如.vector<int> v; v.insert(v.begin(), 42)
(配合使用非常好。
std::vector<bool>* v
时,将有一个指向std::vector<bool>
的未初始化指针。这意味着v
在没有被分配给任何分配的存储器地址的情况下具有一些任意值。您需要创建一个new
矢量并将其指定给v
。
template <typename K, typename V> std::vector<bool>* HashTable<K,V>::wn_to_bool(long wn)
{
auto v = new std::vector<bool>();
for(;wn!=0;wm/=2)
v->push_back(wn % 2 != 0);
return v;
}
您不需要if
语句,因为您直接使用布尔语句的结果。您只需要推回wn%2 != 0
,这比使用if
效率高得多。您还可以使用for
循环来提高可读性,因为您将在一行代码中编写整个逻辑。
正如评论中所建议的那样,在堆内存中创建对象实例(也称为使用new
(应该非常小心,因为当您不再需要分配的内存时,您必须小心删除它,否则会导致内存泄漏。强烈建议使用智能指针。