在我的代码中,我需要构建动态多维数组(矩阵)。我正在使用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]);
)中。正如我所说,错误随机引发,我得到三个不同的错误:
分配时没有错误,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)
编辑:问题已解决。对不起大家和版主。通过越来越多的调试,我终于发现在我的代码“越界”写入(负指数)的某个地方正在发生。谢谢大家。