使用 BigInteger 数组时出现 Malloc 错误

Malloc error when working with BigInteger arrays

我正在为我的一个项目使用 Matt McCutchen's BigInteger library,但在使用 BigInteger 数组时遇到了一个小问题:

下面的代码给了我 malloc: *** error for object 0x7: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug

long create_db(BigInteger min_abc, BigInteger max_abc,
    BigInteger*& abc_range, stats*& run_stats) {

    // Easiest way to do ceil with bigint is via an if statement
    BigInteger temp = (max_abc - min_abc) % JUMP == 0 ? (max_abc - min_abc) / JUMP : ((max_abc - min_abc) / JUMP) + 1;
    long num;
    sscanf(bigIntegerToString(temp).c_str(), "%ld", &num);
    // If the number is too big for a long, it cannot be addressed by a 64-bit computer.


    abc_range = (BigInteger*) malloc(num * sizeof(BigInteger));
    run_stats = (stats*) malloc(num * sizeof(stats));

    // Min is already known, so it is unnecessary
    for(long i = 1; i <= num; i++) {
        if (i == num) {
            abc_range[i - 1] = max_abc;
        } else {
            BigInteger temp = min_abc + (JUMP * i);
            abc_range[i - 1] = temp; // <--- Error here
        }
        //abc_range[i - 1] = i == num ? max_abc : min_abc + JUMP * i;
        run_stats[i - 1] = READY;
    }

    return num;
}

地址0x7是abc_range指向的数组[0]:

p abc_range[0]
(BigInteger)  = {
  sign = positive
  mag = {
    NumberlikeArray<unsigned long> = {
      cap = 0
      len = 1
      blk = 0x0000000000000007
    }
  }
}

出于某种原因,我的程序在使用运算符 = 时试图释放指针。我试过使用 new 而不是 malloc 但我得到了相同的结果。

我做错了什么?

malloc 分配内存但不调用任何构造函数。这就是为什么 new 在 C++ 中被引入的原因。

你应该试试

abc_range = new BigInteger[num];

或者您必须在 malloc.

之后使用 new 位置显式调用构造函数

NumberLikeArray的默认构造函数如下

NumberlikeArray() : cap(0), len(0) {
        blk = NULL;
    }

这意味着默认构造函数肯定不会被调用,因为你在那里有 0x7。