В моей программе я сталкиваюсь со следующей ошибкой:
free(): invalid size
Aborted (core dumped)
Запуск GDB Я обнаружил, что это происходит в деструкторе вектора:
#0 0x00007ffff58e8c01 in free () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x0000555555dd44e2 in __gnu_cxx::new_allocator<int>::deallocate (this=0x7fffffff6bf0, __p=0x555557117810) at /usr/include/c++/7/ext/new_allocator.h:125
#2 0x0000555555dcfbd7 in std::allocator_traits<std::allocator<int> >::deallocate (__a=..., __p=0x555557117810, __n=1) at /usr/include/c++/7/bits/alloc_traits.h:462
#3 0x0000555555dc85e6 in std::_Vector_base<int, std::allocator<int> >::_M_deallocate (this=0x7fffffff6bf0, __p=0x555557117810, __n=1)
at /usr/include/c++/7/bits/stl_vector.h:180
#4 0x0000555555dc49e1 in std::_Vector_base<int, std::allocator<int> >::~_Vector_base (this=0x7fffffff6bf0, __in_chrg=<optimized out>)
at /usr/include/c++/7/bits/stl_vector.h:162
#5 0x0000555555dbc5c9 in std::vector<int, std::allocator<int> >::~vector (this=0x7fffffff6bf0, __in_chrg=<optimized out>) at /usr/include/c++/7/bits/stl_vector.h:435
#6 0x0000555556338081 in Gambit::Printers::HDF5Printer2::get_buffer_idcodes[abi:cxx11](std::vector<Gambit::Printers::HDF5MasterBuffer*, std::allocator<Gambit::Printers::HDF5MasterBuffer*> > const&) (this=0x555556fd8820, masterbuffers=...) at /home/farmer/repos/gambit/copy3/Printers/src/printers/hdf5printer_v2/hdf5printer_v2.cpp:2183
где эта последняя строкакод просто:
std::vector<int> alllens(myComm.Get_size());
Итак, во-первых, я не совсем понимаю, почему здесь вызывается деструктор, но предположим, что это нормальная часть динамического построения вектора, тогда я думаю, что эта ошибка должна бытьиз-за какой-то кучи коррупции.
Я не совсем понимаю, хотя, является ли идея, что какая-то другая часть кода ранее незаконно получила доступ к памяти, которая должна быть выделена для этого вектора?
Во-вторых,Я попытался запустить это через Intel Inspector, и у меня действительно есть куча проблем «Неправильный доступ к памяти» и «Неинициализированный доступ к памяти», но все они выглядят как ложные срабатывания в библиотеках, которые я использую, например, HDF5.
Есть ли какой-то внутрикодовый способ сузить, откуда именно проблема? Например, поскольку это вызвано динамическим распределением памяти, могу ли я просто начать выделять огромные массивы раньше и раньше в коде, чтобы попытаться вызвать сбой ближе к месту его возникновения? Я пытался найти, будет ли что-то подобное работать или быть полезным, но ничего не нашел, так что, может быть, это не очень хорошая идея?