由于 vector<vector<int>> 用法,核心转储堆栈指示 SIGSEGV

core dump stack indicates SIGSEGV due to vector<vector<int>> usage

我有一个代码片段表现得很奇怪。该代码只是旨在实现基数和桶排序。当我在任何一种类型和 运行 的主要评论中发表评论时,它都能完美运行。但是当我同时启用它们时,我得到了一个核心转储。奇怪的部分是核心转储,正如堆栈所指示的那样,它正在进入 stl_vector.h。

代码参考在这里:- https://rextester.com/RUUDP10453

当我在 main 中只启用如下所示的一种时,它工作正常。

  //doRadixSort(arr, size);
    doBucketSort(arr, size);
   or
  doRadixSort(arr, size);
  //doBucketSort(arr, size);  

但是当两者都启用时,如

所示,两种排序都完成后会出现分段错误
cout << "i am here at exit" << endl;

核心转储堆栈指示一些 reference/hint 在向量桶的向量处。但我已经正确分配并保留了所需的内存。所以为什么会这样,我需要一些专业知识来挖掘。我已经尝试在 eclipse CDT C++ 中调试这个大约 2 小时,没有引导。

Program terminated with signal SIGSEGV, Segmentation fault.
#0  _int_free (av=0x7f66d702eb00 <main_arena>, p=0xf98020, have_lock=0) at malloc.c:3976
3976                  >= ((char *) av->top + chunksize(av->top)), 0))
(gdb) where
#0  _int_free (av=0x7f66d702eb00 <main_arena>, p=0xf98020, have_lock=0) at malloc.c:3976
#1  0x00007f66d6cf33dc in __GI___libc_free (mem=<optimized out>) at malloc.c:2966
#2  0x00000000004030fa in __gnu_cxx::new_allocator<std::vector<int, std::allocator<int> > >::deallocate (this=0x7fffc6ffa060, __p=0xf98030) at /usr/include/c++/6.3.1/ext/new_allocator.h:110
#3  0x0000000000402d23 in std::allocator_traits<std::allocator<std::vector<int, std::allocator<int> > > >::deallocate (__a=..., __p=0xf98030, __n=10) at /usr/include/c++/6.3.1/bits/alloc_traits.h:442
#4  0x00000000004027ac in std::_Vector_base<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >::_M_deallocate (this=0x7fffc6ffa060, __p=0xf98030, __n=10)
    at /usr/include/c++/6.3.1/bits/stl_vector.h:178
#5  0x00000000004025e4 in std::_Vector_base<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >::~_Vector_base (this=0x7fffc6ffa060, __in_chrg=<optimized out>)
    at /usr/include/c++/6.3.1/bits/stl_vector.h:160
#6  0x000000000040211d in std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >::~vector (this=0x7fffc6ffa060, __in_chrg=<optimized out>)
    at /usr/include/c++/6.3.1/bits/stl_vector.h:427
#7  0x0000000000401d4b in doBucketSort (arr=0x7fffc6ffa100, size=@0x7fffc6ffa0f8: 12) at tako.cpp:97
#8  0x0000000000401e29 in main (argc=1, argv=0x7fffc6ffa218) at tako.cpp:141
(gdb) 

或者,我发现下面的方法也可以工作,相当于调整大小的功能。

vector<vector<int>> buckets; 
constexpr size_t size=10, bucketSize=10;
buckets.reserve(bucketSize); 
for(unsigned int i=0; i<=bucketSize; ++i) 
    buckets.push_back({ });  
for(unsigned int i=0; i<=bucketSize; ++i) 
    buckets[i].reserve(size);