В моем коде мне нужно построить динамические многомерные массивы (матрицы). Я использую malloc
и free
для этого, и да, я знаю, что это не стиль C ++. Проблема в том, что я получаю ошибку при освобождении массива иногда, случайно, не всегда !
Код распределения:
void allocate_memory(const int &cpiw, const int &cpih)
{
if (_hist == nullptr)
{
_hist = (float ***)malloc(cpih * sizeof(float **));
for (int i = 0; i < cpih; ++i)
{
_hist[i] = (float **)malloc(cpiw * sizeof(float *));
for (int j = 0; j < cpiw; ++j)
{
_hist[i][j] = (float *)malloc(bins * sizeof(float));
}
}
}
_cpiw = cpiw;
_cpih = cpih;
}
Код освобождения (освобождения):
void free_memory()
{
if (_hist != nullptr)
{
for (i = 0; i < _cpih; ++i)
{
for (j = 0; j < _cpiw; ++j)
{
free(_hist[i][j]);
}
free(_hist[i]);
}
free(_hist);
_hist = nullptr;
}
}
Мой код освобождает и перераспределяет массивы в цикле с 20 итерациями. Самое странное, что ошибка всегда возникает (если возникает) на 3-й итерации, всегда в «освобождающем» коде и всегда в большинстве внутренних циклов (free(_hist[i][j]);
). Как я уже сказал, ошибка возникает случайным образом, и я получаю три разные ошибки:
- Ошибка сегментации (ядро сброшено)
- *** Ошибка в `./hog ': munmap_chunk (): неверный указатель: 0x ... *** Прервано (дамп памяти)
- *** Ошибка в.
Я не получаю ошибки при распределении, malloc
s никогда не вернется nullptr
. Если я закомментирую «освобождающий» код, все идет хорошо, без ошибок, без переполнения, без «нехватки памяти». Но я знаю, что это не нормально, и я должен освободить массив.
Редактировать: Стек вызовов при ошибке:
__GI_raise(int sig) (/build/glibc-itYbWN/glibc-2.26/sysdeps/unix/sysv/linux/raise.c:51)
__GI_abort() (/build/glibc-itYbWN/glibc-2.26/stdlib/abort.c:90)
__libc_message(enum __libc_message_action action, const char * fmt) (/build/glibc-itYbWN/glibc-2.26/sysdeps/posix/libc_fatal.c:181)
malloc_printerr(mstate ar_ptr, void * ptr, const char * str, int action) (/build/glibc-itYbWN/glibc-2.26/malloc/malloc.c:5426)
munmap_chunk(mchunkptr p) (/build/glibc-itYbWN/glibc-2.26/malloc/malloc.c:2877)
__GI___libc_free(void * mem) (/build/glibc-itYbWN/glibc-2.26/malloc/malloc.c:3138)
hn::hog::free_memory() (/home/.../CProjects/HOG/hn_hog.h:320)
hn::hog::extractHOG_jpg(const JSAMPROW * image, const int & iw, const int & ih, const int & cw, const int & ch, const int & bw, const int & bh, const int & bins, const int & isunsigned) (/home/.../CProjects/HOG/hn_hog.h:458)
main(int argc, char ** argv) (/home/.../CProjects/HOG/main.cpp:168)
Редактировать: Проблема решена. Извините всех и модераторов. Путем все большей и большей отладки, наконец, я обнаружил, что где-то в моем коде происходили записи «за пределами» (по отрицательным индексам). Спасибо всем.