Valgrind 的无效写入

Le Nguyen Duy Anh

班上:

class Tile {
public:
  long long size, joint;
};

我的主要有:

int main() {
  //
  double minW, minL;
  unsigned tileCap = 10, tileCount = 0;
  bool wasTransformed = false;
  auto *tiles = (Tile*)calloc(tileCap, sizeof(Tile) );

  GetInput(&minW, &minL, &tiles, &tileCount, &wasTransformed);

   //etc.
}

这里有问题的功能是GetInput()

   void GetInput(double *w, double *l, Tile **tiles, unsigned *tileCount, bool *needTransform) {
  //
  printf("Min dimensions:\n");

  if (scanf("%lf %lf", w, l) != 2)
    BadInput();
  if (!CorrectSize(*w) || *w == 0)
    BadInput();
  if (!CorrectSize(*l) || *w == 0)
    BadInput();

  unsigned tileCap = 10;
  *tiles = (Tile*)calloc(tileCap, sizeof(Tile) );

  printf("Tiles:\n");
  double tileSize, tileJoint;
  int argc;

  do {
    argc = scanf("%lf %lf", &tileSize, &tileJoint);
    if(argc == EOF) {
      break;
    }
    if (tileSize == 0 || !CorrectSize(tileSize) || !CorrectSize(tileJoint) || argc != 2)
      BadInput();

    if(! *needTransform) {
      *needTransform = HasFloatingPoint(tileSize) || HasFloatingPoint(tileJoint);
      if(*needTransform)
        TransformPrevious(*tiles, *tileCount);
    }
    if(*needTransform) {
      //transform this
      tileSize *= 10;
      tileJoint *= 10;
    }

    (*tiles)[*tileCount].size = (long long)tileSize + (long long)tileJoint;
    (*tiles)[*tileCount].joint = (long long)tileJoint;

    *tileCount += 1;
    if( (*tileCount) == tileCap) {
      DoubleArray(tiles, &tileCap);
    }
  } while(true);
}

而我的DoubleArray()

void DoubleArray(Tile **array, unsigned *cap) {
   //
  auto *tmp = (Tile*)realloc(*array, 2 * sizeof(Tile) );

  if(tmp) {
    *array = tmp;
    *cap *= 2;
    (*cap)--;
  } else {
    printf("Error allocating memory.\n");
  }
}

运行程序似乎很好,没有显示错误,结果似乎是正确的。例如:

360 217
0.1 0.0
0.2 0.0
0.3 0.0
0.4 0.0
0.6 0.0
0.8 0.0
1.2 0.0
2.4 0.0
4.1 0.0
8.2 0.0
12.3 0.0
16.4 0.0
24.6 0.0
32.8 0.0
49.2 0.0

Valgrind 在12.3 0打印Invalid write of size 8所以在我看来,我错误地重新分配了内存。但是如果我是,如果我打印出来,为什么这些值会正常加载?换句话说,所有输入都正确加载到数组中。

那么我做错了什么?使用memset? free正确?

保罗·弗洛伊德

您正在错误地重新分配内存。该接口std::mallocstd::calloc并且std::realloc有些不一致,关于大小来分配的混乱。std::mallocstd::realloc采用单个大小参数,它应该是对象数乘以它们的大小。std::calloc有两个参数,一个是对象的数量,一个是一个对象的大小。

你在打电话

auto *tmp = (Tile*)realloc(*array, 2 * sizeof(Tile) );

这(重新)为两个瓷砖分配空间。你应该写一些类似的东西

*cap *= 2;
auto *tmp = (Tile*)realloc(*array, *cap * sizeof(Tile) );

额外的内存将未初始化,因此您可能需要将 memset() 设为 0。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无效的写入Valgrind

来自分类Dev

Valgrind无效写入

来自分类Dev

解决 valgrind 中的无效写入错误

来自分类Dev

大小8的无效读取,大小8(Valgrind)的无效写入

来自分类Dev

Valgrind-strcpy的大小为1的无效写入

来自分类Dev

即使对于NULL分配,大小8 valgrind的无效写入

来自分类Dev

Valgrind大小为8的神秘无效写入错误

来自分类Dev

无效的读取内存-valgrind

来自分类Dev

C从valgrind读取无效

来自分类Dev

无效的读写valgrind

来自分类Dev

valgrind错误:无效的读取

来自分类Dev

C ++-从valgrind删除无效

来自分类Dev

为什么这里有一个无效的写入(Valgrind)

来自分类Dev

为什么Valgrind在PETSc中分配char *时报告大小写为8的无效写入?

来自分类Dev

Valgrind错误:使用由struct和malloc构成的列表时,大小为8的无效写入

来自分类Dev

无效的读取-Valgrind和C

来自分类Dev

读取的大小无效-C valgrind

来自分类Dev

Valgrind无效读取4号错误?

来自分类Dev

Valgrind报告无效的重新分配

来自分类Dev

Valgrind:无效读取的8号错误

来自分类Dev

Valgrind:大小为1的无效读/写

来自分类Dev

Valgrind报告无效的重新分配

来自分类Dev

C ++无效的读取大小4 valgrind

来自分类Dev

Valgrind:无效读取的8号错误

来自分类Dev

使用valgrind时无效读取大小1

来自分类Dev

Valgrind 错误无效读取大小 4

来自分类Dev

Valgrind在C中无效的free()/ delete / delete [] / realloc()

来自分类Dev

c Valgrind读取大小4无效->分段错误

来自分类Dev

Valgrind中大小为4的无效读/写