我在使用删除 [] 运算符时收到 free() 错误



我不知道为什么我得到

*** Error in `./a.out': free(): invalid next size (fast): 0x00000000006db0e0 ***

在尝试释放 g 时,U 和在 subs_sum 中声明的子集数组在以下代码中起作用:

#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;
}

如果我评论掉,我没有遇到任何问题

delete [] g;
delete [] u;
delete [] subset;

程序按预期运行:

$ echo -e "11n1n41n10n24n5n12n6n14n9n35n7n" | ./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;
  }

这是在最后一次迭代中:

g[n-1] = 0;

缓冲区溢出是未定义行为的常见情况,这意味着任何事情都可能发生。

似乎在这种情况下,您打乱了分配器的簿记,这实际上是被诊断出来的。
这样的幸福结果是无法保证的。

为什么它说free发现了错误,而不是delete
好吧,封面下的删除表达式调用对象上的 dtor(除非对于基元类型来说,琐碎的又名 no-op(,然后函数operator delete .
后者通常只是将请求转发给free

最新更新