为什么 clang-tidy 给我这个 C++ 代码未初始化的错误?

问题描述 投票:0回答:1

我已经为此挠头好几个小时了,但仍然不明白为什么我的代码有问题。我已确保初始化 2D 数组中的每个值,因此任何地方都不应该出现未初始化值错误!

注意:我不能在该项目中使用 STD::VECTOR。我还使用不同的函数而不是 std::min() 因为我不允许为此项目导入算法。

这是clang-tidy报告的错误:

2nd function call argument is an uninitialized value

这是我的代码(错误仅发生在第 17 行):

int** SeamCarver::CarvingSeamVertical() const {
  int** energies = new int*[height_];
  for (unsigned int row = 0; row < height_; row++) {
    energies[row] = new int[width_];
    for (unsigned int col = 0; col < width_; col++) {
      energies[row][col] = 0; // initializes every value in the 2D array to zero
    }
  }
  for (unsigned int col = 0; col < width_; col++) {
    energies[height_ - 1][col] = this->GetEnergy(height_ - 1, (int)col);
  }

  for (int row = height_ - 2; row >= 0; row--) {
    for (int col = 0; col < width_; col++) {
      int best = 0;
      if (col == 0) { //error occurs here v
        best = FindMinTwo(energies[row + 1][col], energies[row + 1][col + 1]);
      } else if (col == width_ - 1) {
        best = FindMinTwo(energies[row + 1][col - 1], energies[row + 1][col]);
      } else {
        best = FindMinThree(energies[row + 1][col - 1],
                            energies[row + 1][col],
                            energies[row + 1][col + 1]);
      }
      energies[row][col] = this->GetEnergy(row, col) + best;
    }
  }
  return energies;
} // energies is properly deallocated by the function that uses it

我尝试将整数更改为无符号整数,但错误并没有消失。我也不应该遇到越界访问错误,因为行从

height - 2
开始,并且循环内访问的行的最高值是
height - 1

c++ initialization indexoutofboundsexception
1个回答
0
投票

第17行,您访问

energies[row + 1][col + 1]
,在第二维中,数组仅被分配和初始化,直到
width_ - 1
,但
col + 1
最终等于
width_

将 for 循环范围更改为 [1; width_ - 1[ 或分配一个更大的数组并初始化它。

© www.soinside.com 2019 - 2024. All rights reserved.