C++ I';使用delete[]运算符时出现m get free()错误
我想不出为什么我会这样C++ I';使用delete[]运算符时出现m get free()错误,c++,heap-corruption,delete-operator,C++,Heap Corruption,Delete Operator,我想不出为什么我会这样 *** Error in `./a.out': free(): invalid next size (fast): 0x00000000006db0e0 *** 在以下代码中尝试释放subs_sum函数中声明的g、u和子集数组时: #include <iostream> #include <algorithm> #include <new> using namespace std; int subs_sum(int n, int
*** Error in `./a.out': free(): invalid next size (fast): 0x00000000006db0e0 ***
在以下代码中尝试释放subs_sum函数中声明的g、u和子集数组时:
#include <iostream>
#include <algorithm>
#include <new>
using namespace std;
int
subs_sum(int n, int * numbers)
{
int * g = new int [n-1];
int * u = new int [n-1];
int * subset = new int [n-1];
int i, j;
int sum = 0, nelem = 0;
int found = 0;
for (i=0; i<=n-1; i++)
{
g[i] = 0;
u[i] = 1;
}
do
{
i = 0;
j = g[0] + u[0];
while ((j>=2) || (j<0))
{
u[i] = -u[i];
i++;
j = g[i] + u[i];
}
if (g[i])
{
g[i] = 0;
nelem--;
sum -= numbers[i];
}
else
{
g[i] = 1;
nelem++;
sum += numbers[i];
}
if (g[n-1]) break;
if (sum == numbers[n-1])
{
if (nelem == n-1) // Success!!!
{
// Print partial result
for (int ll=0; ll<=n-2; ll++)
if (g[ll]) cout << numbers[ll] << "+";
cout << "\b=" << sum << endl;
found = 1;
break;
}
if (n-1-nelem >= 2) // Go deeper.
{
int pp = 0;
for (int ll=0; ll<=n-2; ll++)
if (! g[ll]) subset[pp++] = numbers[ll];
if (subs_sum(n-1-nelem, subset)) // Match found!!!
{
// Print partial result
for (int ll=0; ll<=n-2; ll++)
if (g[ll]) cout << numbers[ll] << "+";
cout << "\b=" << sum << endl;
found = 1;
break;
}
}
}
}
while(1);
delete [] g;
delete [] u;
delete [] subset;
return found;
}
int
main(void)
{
int * numbers;
int i;
cin >> i;
numbers = new int [i];
for (int j=0; j<i; j++)
cin >> numbers[j];
cout << "Sorted Numbers: ";
sort(numbers, numbers+i);
for (int j=0; j<i; j++)
cout << numbers[j] << " ";
cout << endl;
subs_sum(i, numbers);
delete [] numbers;
return 0;
}
程序按预期运行:
$ echo -e "11\n1\n41\n10\n24\n5\n12\n6\n14\n9\n35\n7\n" | ./a.out
Sorted Numbers: 1 5 6 7 9 10 12 14 24 35 41
1+5=6
9+12+14=35
7+10+24=41
有什么想法吗?谢谢您的阵列不够大。将它们分配为
new int[n]
而不是new int[n-1]
int * g = new int [n-1];
分配一个数组n-1
int
,索引0到n-1-1
稍后,您可以访问:
for (i=0; i<=n-1; i++)
{
g[i] = 0;
u[i] = 1;
}
缓冲区溢出是未定义行为的常见情况,这意味着可能发生任何事情
在本例中,您似乎扰乱了分配器的簿记,而实际上,分配器已被诊断。这样一个令人高兴的结果是无法保证的 为什么它说
free
找到了错误,而不是delete
?好的,封面下的delete表达式调用对象上的dtor(除非对于基元类型没有操作),然后调用函数
操作符delete
后者通常只是将请求转发给
free
如果您不明白为什么在使用delete[]
时报告free()
,这是因为delete[]
通常(在封面下)做记账工作(如果需要调用析构函数等),然后委托给free()
执行实际内存释放。用于(i=0;i
for (i=0; i<=n-1; i++)
{
g[i] = 0;
u[i] = 1;
}
g[n-1] = 0;