使用 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。
我正在为我的一个项目使用 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
.
NumberLikeArray
的默认构造函数如下
NumberlikeArray() : cap(0), len(0) {
blk = NULL;
}
这意味着默认构造函数肯定不会被调用,因为你在那里有 0x7。