C ++:尝试将已分配的内存“释放”到三维数组时出错

时间:2018-05-09 21:58:32

标签: c++ c memory malloc free

在我的代码中,我需要构建动态多维数组(矩阵)。我正在使用mallocfree来执行此操作,是的,我知道这不是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. ***“./hog”出错:双重免费或损坏(输出):0x ... ***中止(核心转储)
  4. 分配时没有错误,malloc永远不会返回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)
    

    编辑:问题已解决。对不起大家和版主。通过越来越多的调试,我终于发现在我的代码“越界”写入(负指数)的某个地方正在发生。谢谢大家。

0 个答案:

没有答案