*array[] 未初始化 - 代码分析警告 C6001
*array[] is not initialized - Code Analysis Warning 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
}
上面的代码完美运行 - 唯一的问题是当我 运行 代码分析时它说警告(内存安全)C6001 - '*arrTemp[i]' 未初始化。
我不太明白为什么它认为它没有被初始化——我也有这样的函数用于 3D 数组(当然所有的东西都有动态内存分配)并且它没有显示任何问题。
我尝试修复了几次,但无济于事:
1. new int*[]完成后初始化为nullptr;
2.循环完成后将二维数组的值初始化为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])];
但仅将有意义的值分配给这些子数组中的 arraySize1
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];
它试图从 arrTemp[arrSize1][i2]
中读取垃圾。因此警告。
所以,我编写了一个调整二维数组大小的函数。
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
}
上面的代码完美运行 - 唯一的问题是当我 运行 代码分析时它说警告(内存安全)C6001 - '*arrTemp[i]' 未初始化。
我不太明白为什么它认为它没有被初始化——我也有这样的函数用于 3D 数组(当然所有的东西都有动态内存分配)并且它没有显示任何问题。
我尝试修复了几次,但无济于事: 1. new int*[]完成后初始化为nullptr; 2.循环完成后将二维数组的值初始化为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])];
但仅将有意义的值分配给这些子数组中的 arraySize1
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];
它试图从 arrTemp[arrSize1][i2]
中读取垃圾。因此警告。