C ++: ошибка при попытке «освободить» выделенную память для трехмерного массива - PullRequest
0 голосов
/ 10 мая 2018

В моем коде мне нужно построить динамические многомерные массивы (матрицы). Я использую 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]);). Как я уже сказал, ошибка возникает случайным образом, и я получаю три разные ошибки:

  1. Ошибка сегментации (ядро сброшено)
  2. *** Ошибка в `./hog ': munmap_chunk (): неверный указатель: 0x ... *** Прервано (дамп памяти)
  3. *** Ошибка в.

Я не получаю ошибки при распределении, 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)

Редактировать: Проблема решена. Извините всех и модераторов. Путем все большей и большей отладки, наконец, я обнаружил, что где-то в моем коде происходили записи «за пределами» (по отрицательным индексам). Спасибо всем.

...