隐式转换将signedness'int'更改为'unsigned int'

时间:2015-02-11 05:56:13

标签: c++ implicit-conversion memset

我使用clang ++编译程序,我需要在clang ++中编译它而没有错误。我的其他编译器没有错误。

代码中的错误行是

memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants);

整个功能是这样的:

Ocean::Ocean(int num_boats, int x_quadrants, int y_quadrants)
{
  grid_ = new int[x_quadrants * y_quadrants];
  memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants);
  x_quadrants_ = x_quadrants;
  y_quadrants_ = y_quadrants;
  boats_ = new Boat[num_boats];
  num_boats_ = num_boats;

  stats_.hits = 0;
  stats_.misses = 0;
  stats_.duplicates = 0;
  stats_.sunk = 0;
}

我正在使用memset,所以当使用不同的驱动程序进行测试时,我不会获得垃圾值输出。没有必要为clang提供命令行,因为我不允许更改它。

2 个答案:

答案 0 :(得分:7)

替换

grid_ = new int[x_quadrants * y_quadrants];
memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants);

只是

grid_ = new int[x_quadrants * y_quadrants]();

注意括号,它告诉编译器你想要这个零初始化(或者真正的值初始化,这里减少为零初始化)。

更好的是,使用std::vector代替这种危险的DIY方案。

答案 1 :(得分:1)

sizeof会返回未签名的std::size_t。您与(已签名)int变量相乘,因此如果您在clang中启用-Wsign-conversion则会出现警告。

您可以static_cast尺寸为无符号以避免警告 - 如果需要,可以添加针对负值(例如assert)的警示。

(您的代码可能会受益于使用member initializer list。)