【问题标题】:Overlapping multidimensional array corruption [closed]重叠多维数组损坏[关闭]
【发布时间】: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


【解决方案1】:

您可能会超出任何数组的范围,或者您可能会超出范围其他地方。

如果你使用的是 Visual Studio 2019,或者你使用的是 gcc 或 clang,你可以试试 ASan (Address Sanitizer)。 (VS2019 link)

否则你可以尝试Application Verifier启用全堆检查。

也可以使用自定义分配和分配内存的方式,它会在越界访问冲突,即使关闭了一个。它本质上是为特定分配复制 Application Verifier。

使用 cmets 中推荐的 std::array 或 std::vector 也有助于减少首先导致堆损坏的错误。 vector 自动管理释放,并且在调试版本中可能会检查超出范围的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多