我可以删除传递给函数的double *作为参数吗?

时间:2015-04-10 19:43:54

标签: c++ pointers free dynamic-memory-allocation

我编写了以下函数来动态地为double*数组分配内存:(我还为int*编写了一个函数)

void add_memory(double* double_array, int current_idx, int max)
{
  max = max * 2;
  double* temp_double_array = new double[max];
  for (int i = 0; i < current_idx; i++) {
    temp_double_array[i] = double_array[i];
  }
  delete [] double_array;
  double_array = temp_double_array;
}

我这样称呼这个函数:

int n_max = 10;
int m_max = 10;
double* val = new double[n_max];
int* col_ind = new int[n_max];
int* row_ptr = new int[m_max];
int n = 0;
int m = 0;

for (int i = 0; i < sz; i++) {
  int first_val_ind = -1;
  for (int j = 0; j < sz; j++) {
    if (B[i][j] == 0) {
      if (n == n_max) {
        add_memory(val, n, n_max);
        add_memory(col_ind, n, n_max);
        n_max = n_max * 2;
      }
      val[n] = B[i][j];
      col_ind[n] = j;
      if (first_val_ind == -1) {
        if (m == m_max) {
          add_memory(row_ptr, m, m_max);
          m_max = m_max * 2;
        }
        first_val_ind = n;
        row_ptr[m] = first_val_ind;
        m++;
      }
      n++;
    }
  }
}

我收到一条错误,根据this SO question似乎正在发生错误,因为我正在删除我尚未宣布的内存。

我的错误是:*** glibc detected *** ./mm2: free(): invalid next size (fast): 0x00000000016ae220 ***

是不是因为我试图在本地删除全局变量?

2 个答案:

答案 0 :(得分:2)

问题是你要两次删除相同的数组。考虑一下这里发生的事情:

void add_memory(double* double_array, int current_idx, int max)
{
    // ...
    delete [] double_array;
    double_array = temp_double_array; // <== double_array is local to add_memory
                                      // so this line has no effect
}

您使用val调用它,val被删除。但是在循环的下一次迭代中,您再次使用val调用它。但val已被删除!当然,您在add_memory内分配了一个新数组,但该函数外部没有任何内容可以访问它。您需要return

double* add_memory(double* double_array, int current_idx, int max)
{
    // ...
    delete [] double_array;
    return temp_double_array;
}

然后你必须覆盖val

val = add_memory(val, n, n_max);

请注意,在程序结束时,您仍需要delete []所有数组,因为它们现在已被泄露。

(令人注意到在这里使用vector)。

答案 1 :(得分:1)

传递对指针的引用应该有效:

void add_memory(double*& double_array, int current_idx, int max)
{
  max = max * 2;
  double* temp_double_array = new double[max];
  for (int i = 0; i < current_idx; i++) {
    temp_double_array[i] = double_array[i];
  }
  delete [] double_array;
  double_array = temp_double_array;
}

这不需要你返回任何东西。