0

我在函数内部调用 delete 时遇到问题。当我使用新的内部函数分配内存时,它似乎确实有效,但删除以前分配的内存会导致抛出 std::bad_alloc。是否有可能,或者我只能从 main 内部释放“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);
}
4

1 回答 1

2

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

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

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

而且因为你已经增加size了,你的循环在a. 您需要使用与size分配数组时相同的值。

说得很清楚,以下是执行流程:

  • size被赋值给值5
  • a分配有长度5
  • size递增到 value 10
  • 您从to运行一个for循环,即to ,然后调用。0size-109delete[] a[i]

显然,5对inclusive 的迭代正在访问未分配9的元素。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。标准容器将处理内存分配的细节,并且会正确执行。

于 2013-12-14T19:24:03.080 回答