问题描述:
C++内存写越界导致堆内存被破坏致使new失败的问题定位总结。报错信息:test_CRGraph: malloc.c:2379: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)’ failed.:
//(*curPtLayer).inputAddr_[0]为void*指针
(*curPtLayer).inputAddr_[0] = new T[lastNodeOutputSize]{0};
原因:
在这之前有内存写越界的地方,破坏了栈内存结构。
for (int h = 0; h < inputMatrixHeight; h++)
{
for (int i = 0; i < scaleH; i++)
{
for (int w = 0; w < inputMatrixWidth; w++)
{
for (int j = 0; j < scaleW; j++)
{
for (int c = 0; c < inputChNum; c++)
{
//inputMatrixHeight*scaleH*inputMatrixWidth*scaleW*inputChNum 大小超出了申请的内存
((T*)outputAddrList)[h*inputMatrixWidth*inputChNum*scaleH*scaleW + i*inputChNum*inputMatrixWidth*scaleW + w*inputChNum*scaleW + j*inputChNum + c]\
= ((T*)inputMatrixAddr)[h*inputMatrixWidth*inputChNum + w*inputChNum + c];
// cout << "output:::" << ((T*)outputAddrList)[h*inputMatrixWidth*inputChNum*scaleH*scaleW + i*inputChNum*inputMatrixWidth*scaleW + w*inputChNum*scaleW + j*inputChNum + c] << endl;
}
}
}
}
}
解决方案:
查找内存越界点,可借助valgrind工具查找无效的读写的位置。