C++ std::vector не может быть уничтожен с помощью «munmap_chunk(): неверный указатель» [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C++ std::vector не может быть уничтожен с помощью «munmap_chunk(): неверный указатель» [дубликат]

Сообщение Anonymous »

Я новичок в gdb, так что, возможно, вопрос не ценный, но он меня очень смутил. Я обнаружил, что мой код иногда дает сбой, файл дампа ядра показывает, что сигналом сбоя является SIGABRT, а обратная трассировка –

Код: Выделить всё

#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=140188693307392) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=140188693307392) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=140188693307392, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007f8039485476 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007f803946b7f3 in __GI_abort () at ./stdlib/abort.c:79
#5  0x00007f80394cc676 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f803961eb77 "%s\n") at ../sysdeps/posix/libc_fatal.c:155
#6  0x00007f80394e3cfc in malloc_printerr (str=str@entry=0x7f8039621210 "munmap_chunk(): invalid pointer") at ./malloc/malloc.c:5664
#7  0x00007f80394e3fdc in munmap_chunk (p=) at ./malloc/malloc.c:3060
#8  0x00007f80394e849a in __GI___libc_free (mem=) at ./malloc/malloc.c:3381
#9  0x00007f7fbc5dd1c5 in __gnu_cxx::new_allocator::deallocate (__t=, __p=, this=0x7fff39d1adf0) at /usr/include/c++/11/ext/new_allocator.h:145
#10 std::allocator_traits::deallocate (__n=, __p=, __a=...) at /usr/include/c++/11/bits/alloc_traits.h:496
#11 std::_Vector_base::_M_deallocate (__n=, __p=, this=0x7fff39d1adf0) at /usr/include/c++/11/bits/stl_vector.h:354
#12 std::_Vector_base::~_Vector_base (this=0x7fff39d1adf0, __in_chrg=) at /usr/include/c++/11/bits/stl_vector.h:335
#13 std::vector::~vector (this=0x7fff39d1adf0, __in_chrg=) at /usr/include/c++/11/bits/stl_vector.h:683
#14 FS::FSBuf::~FSBuf (this=0x7fff39d1adc0, __in_chrg=) at /home/cmen/Projects-Code/acq_proc/src/acq_proc/cpp/include/fs/fs_basic.h:22
#15 0x00007f7fbc5dbf45 in FS::FSModule::run (this=this@entry=0x560cb230b8e0, flagPlotStatus=flagPlotStatus@entry=12...
обратите внимание, что кадр №6 показывает причину сбоя «munmap_chunk(): неверный указатель», и мы переходим к кадру №15, который находится в последней строке функции FS::FSModule ::run, с помощью i locals я обнаружил, что локальная переменная «FSBuf buf» содержит векторы, к которым нет доступа. FSBuf — это структура, которая содержит несколько больших векторов, все векторы будут назначены в конструкторе FSBuf, чтобы избежать выделения памяти во время выполнения процесса вычислений. Когда я попытался использовать buf.xxx, некоторые векторы невозможно было распечатать, например

Код: Выделить всё

(gdb) p buf.comp
$48 = std::vector of length 1209600000, capacity 1209600000 = {6456, 7599, 6456, 0, 0, 0, 0, 280, -8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 284, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 17232, 134, 0, 0, 149, 126, -6, -1, 134, -2, 0, 0, 0, 0, 134, -2, -1, 0, 0, -4, 130, -3, 0, -3, 0,
0, 0, 0, 0, -1, 0, 134, -4, 0, 0, -2, 0, 0, 0, 5580, 22163, 5580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...}
но к некоторым векторам доступ невозможен, например

Код: Выделить всё

(gdb) p buf.conv
$49 = std::vector of length 30240000, capacity 30240000 = {Cannot access memory at address 0x7f77d3d93010
FSBuf похож на

Код: Выделить всё

struct FSBuf {
std::vector comp;
std::vector conv;
FSBuf::FSBuf(size_t comp_size, size_t conv_size);
И конструктор похож на

Код: Выделить всё

FSBuf::FSBuf(size_t comp_size, size_t conv_size) :
comp(comp_size),
conv(conv_size) {}
Я хочу знать, каковы возможные причины невозможности доступа к вектору? Я проверил код, нет возможности освободить или удалить векторы в buf.
Или какую информацию мне нужно получить какие-нибудь другие команды GDB?

Подробнее здесь: https://stackoverflow.com/questions/791 ... id-pointer
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»