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;