【发布时间】:2017-05-01 18:41:17
【问题描述】:
我对两个动态分配和重新分配的多维数组有一个非常隐蔽的问题,定义如下:
int *pRawVals[20][181];
和
int *pMaxPlaneRawPlanes[20][46];
这些被分配在一个函数中:(为了清楚起见,代码被压缩)
...
// iNlat and iNVer bounds checked and OK
for (int lat = 0; lat < iNlat; lat++)
{
pData->pBlendedRawPlanes[lat] = new long long[1 * (iNver + 1)];
for (int sensor = 0; sensor < 20; sensor++)
{
pData->pRawVals[sensor][lat] = new int[1 * (iNver + 1)];
for (int vert = 0; vert <= iNver; vert++)
{
pData->pRawVals[sensor][lat][vert] = SENSOR_UNREAD;
} // end for
} // end for
} // end for
...
for (int sensor = 0; sensor < 20; sensor++)
{
delete[] pData->strayVals[sensor];
pData->strayVals[sensor] = new int[1 * (iNver + 1)];
for (int vert = 0; vert < iNver + 1; vert++)
{
pData->strayVals[sensor][vert] = SENSOR_UNREAD;
} // end for
for (int lat = 0; lat < 46; lat++)
{
pData->pMaxPlaneRawPlanes[sensor][lat] = new int[361];
// for (int iFillMem = 0; iFillMem < 361; iFillMem++)
for (int vert = 0; vert < iNver; vert++)
{
pData->pMaxPlaneRawPlanes[sensor][lat][vert] = SENSOR_UNREAD;
} // end for
} // end for
} // end for
... and deallocated in another function:
for (int lat = 0; lat < pData->iNUserLats; lat++) // iNUserLats <= 181
{
for (int sensor = 0; sensor < 20; sensor++)
{
if (pData->pRawVals[sensor][lat] != NULL)
{
delete[] pData->pRawVals[sensor][lat];
pData->pRawVals[sensor][lat] = NULL;
} // end if
} // end for
}
...
for (int sensor = 0; sensor < 20; sensor++)
{
for (int lat = 0; lat < 46; lat++)
{
if (pData->pMaxPlaneRawPlanes[sensor][lat] != NULL)
{
delete[] pData->pMaxPlaneRawPlanes[sensor][lat];
pData->pMaxPlaneRawPlanes[sensor][lat] = NULL;
} // end if
} // end for
} // end for
希望我收到了足够多的代码。无论如何,在第二次通过代码时释放pMaxPlaneRawPlanes 时,结果表明该数组的某些元素与pRawVals 的元素重叠,并且释放导致崩溃 - 似乎这些位置之前可能已被释放但我似乎无法准确指出它是如何发生的。
关于如何缩小这种情况的任何提示?我在 Windows 7 Ultimate 64 位上运行开发,但该应用程序是为 32 位编译的。
谢谢
【问题讨论】:
-
考虑使用
std::array而不是C 风格的数组。考虑使用std::vector而不是手动分配。 -
看来
pMaxPlaneRawPlanes总是具有完全相同的尺寸。没有必要动态分配最后一个维度。 -
如果你用 new 操作符创建了 2 个内存块,它们是不可能相互重叠的。您是否在 pRawVals 和 pMaxPlaneRawPlanes 之间进行某种混合?
标签: c++ arrays multidimensional-array heap-memory heap-corruption