重叠的多维数组损坏

时间:2017-05-01 18:41:18

标签: c++ arrays multidimensional-array heap heap-corruption

我有一个非常隐蔽的问题,有两个动态分配和重新分配的多维数组,定义如下:

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位。

由于

0 个答案:

没有答案