在函数内部使用delete

时间:2013-12-14 19:21:18

标签: c++ memory bad-alloc

我在函数中调用delete有问题。当我使用新的内部函数分配内存时,它似乎工作,但删除以前分配的内存会导致抛出std :: bad_alloc。它是否可能,或者我只能从主内部的“a”下释放内存?

#include <iostream>

using namespace std;

int size = 5;

void alloc (int* t, char**& a) {
  t = new int [size];
  a = new char* [size];
  for (int i = 0; i < size; ++i)
    a[i] = new char [size];
  cout << "allocated\n";
}

void realloc (char**& a) {
  for(int i = 0; i < size; ++i)
    delete [] a[i];
  delete [] a;
  cout << "deleted\n";
  a = new char* [size];
  for (int i = 0; i < size+5; ++i)
    a[i] = new char [size+5];
  cout << "allocated\n";
}
void fillArray (char** a) {
  for (int i = 0; i < size; ++i) {
    for (int j = 0; j < size; ++j) {
      a[i][j] = '.';
    }
  }
}

void printArray (char** a) {
  for (int i = 0; i < size; ++i) {
    for (int j = 0; j < size; ++j) {
      cout << a[i][j];
    }
    cout << endl;
  }
}
int main() {
  int* t;
  char** a;
  alloc(t, a);
  fillArray(a);
  printArray(a);
  size+=5;
  realloc(a);
  fillArray(a);
  printArray(a);
}

1 个答案:

答案 0 :(得分:2)

您可以从任何地方拨打delete[]。你的问题更加平淡无奇。你的代码中只有一个缺陷。

您分配一个长度为size的数组。然后你增加size。然后你这样做:

for(int i = 0; i < size; ++i)
    delete [] a[i];

因为你已经增加了size,你的循环就会在a的末尾运行。您需要使用与分配数组时使用的size相同的值。

很明显,以下是执行流程:

  • size已分配给值5
  • a的分配长度为5
  • size会增加到值10
  • 您从for0运行size-1循环,即09,并致电delete[] a[i]

显然,59的迭代正在访问未分配的a元素。那个未定义的行为,等等。

您可以通过将新大小作为参数传递给realloc函数来解决此问题。像这样:

void realloc (char**& a, size_t newsize) {
  for(int i = 0; i < size; ++i)
    delete [] a[i];
  delete [] a;

  size = newsize;
  a = new char* [size];
  for (int i = 0; i < size; ++i)
    a[i] = new char [size];
}

显然你不会在这个函数之外修改size。您可以像这样调用函数:

realloc(a, size+5);

进一步说,你可以选择像这样处理分配:

size_t size = 5;

void alloc(char**& a, size_t newsize) {
  size = newsize;
  a = new char*[size];
  for (int i = 0; i < size; ++i)
    a[i] = new char[size];
}

void realloc(char**& a, size_t newsize) {
  for(int i = 0; i < size; ++i)
    delete[] a[i];
  delete[] a;
  alloc(a, size+5);
}

所有这一切,并且坦率地说,你的整个计划都是一场灾难。还有许多其他错误,我在这个答案中没有涉及。使用std::vectorstd::string等标准容器。标准容器将处理内存分配的细节,并将正确执行。