стек дампа ядра указывает SIGSEGV из-за вектораиспользование - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть фрагмент кода, который ведет себя странно. Код просто нацелен на реализацию оснований и сортировки. Когда я комментирую в основном один из вариантов сортировки и запуска, он работает отлично. Но когда я включаю их обоих, я получаю дамп ядра. И странная часть - дамп ядра, как указывает стек, переходит в stl_vector.h.

Код ссылки здесь: - https://rextester.com/RUUDP10453

Когда я включаю только один из видов, как показано ниже, он работает нормально.

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

Но когда оба включены, возникает ошибка сегментации после того, как оба вида завершены, как указано

cout << "i am here at exit" << endl;

Стек дампа ядра указывает на некоторую ссылку / подсказку на вектор векторных блоков. Но я правильно выделил и зарезервировал ему необходимую память. так почему это происходит, мне нужен опыт, чтобы выкопать. Я пытался отладить это в 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) 

1 Ответ

0 голосов
/ 14 ноября 2018

Кроме того, я обнаружил, что ниже также работает, что эквивалентно функции изменения размера.

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); 
...