*数组[]未初始化-代码分析警告C6001



因此,我编写了一个函数来调整二维数组的大小。

void resizeArray(int **&arr, short &arrSize1, short* &arrSize2, const int &amount)
{
    int** arrTemp = new int*[arrSize1 + 1]; // Creating a 2D array
    for (short i(0); i < arrSize1 + 1; i++) // For each arrTemp[i] an array is created
        arrTemp[i] = new int[(arrSize2[i] == 0 ? 1 : arrSize2[i])];
    for (short i(0); i < arrSize1; i++) // Copying old values to the new BIGGER temp array
        for (short i2(0); i2 < (arrSize2[i] == 0 ? 1 : arrSize2[i]); i2++)
            arrTemp[i][i2] = arr[i][i2];
    for (short i(0); i < arrSize1; i++)
        delete[] arr[i];
    if (arrSize1) // The first time this function is ran arrSize1 is 0 and arr is a nullptr
    {
        delete[] arr;
        arr = nullptr;
    }
    arr = new int*[arrSize1 + 1]; // Creating the new BIGGER arr
    for (short i(0); i < arrSize1 + 1; i++) // Creating the sub-arrays(or second dimension)
        arr[i] = new int[(arrSize2[i] == 0 ? 1 : arrSize2[i])];
    for (short i(0); i < arrSize1 + 1; i++) // Copying from arrTemp to arr
        for (short i2(0); i2 < (arrSize2[i] == 0 ? 1 : arrSize2[i]); i2++)
            arr[i][i2] = arrTemp[i][i2];
    for (short i(0); i < arrSize1 + 1; i++) // Deleting arrTemp
        delete[] arrTemp[i];
    delete[] arrTemp;
    arrTemp = nullptr;
    for (short i(0); i < (arrSize2[arrSize1] == 0 ? 1 : arrSize2[arrSize1]); i++)
        arr[arrSize1][i] = amount; // Setting the newly created sub-array to a value
}

上面的代码运行得很好——唯一的问题是当我运行代码分析时,它说Warning(Memory Safety)C6001-"*arrTemp[I]"没有初始化。

我不太明白为什么它认为它没有初始化——我对3D阵列也有这样的函数(当然是所有具有动态内存分配的函数),它没有显示出任何问题。

我试着修复了好几次,但都无济于事:1.在完成新的int*[]之后初始化为nullptr;2.循环完成后,将2D阵列的值初始化为0;3.其他一些愚蠢的事情。。。。。

那么,这是Visual Studio中的错误(顺便说一句:)还是我的代码中找不到的东西?

p.S。添加了评论;

您的代码会生成此警告,因为当您构建arrTemp时,您会分配arraySize1 + 1子阵列

for (short i(0); i < arrSize1 + 1; i++)
    arrTemp[i] = new int[(arrSize2[i] == 0 ? 1 : arrSize2[i])];

但是仅将有意义的值分配给那些子阵列的CCD_ 3

for (short i(0); i < arrSize1; i++)
    for (short i2(0); i2 < (arrSize2[i] == 0 ? 1 : arrSize2[i]); i2++)
        arrTemp[i][i2] = arr[i][i2];

之后,像arrTemp[arrSize1][i2]这样的所有条目仍然包含垃圾。

稍后你做

for (short i(0); i < arrSize1 + 1; i++)
    for (short i2(0); i2 < (arrSize2[i] == 0 ? 1 : arrSize2[i]); i2++)
        arr[i][i2] = arrTemp[i][i2];

其尝试从CCD_ 5读取垃圾。因此发出警告。

相关内容

  • 没有找到相关文章

最新更新