Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用delete-inside函数_C++_Memory_Bad Alloc - Fatal编程技术网

C++ 使用delete-inside函数

C++ 使用delete-inside函数,c++,memory,bad-alloc,C++,Memory,Bad Alloc,我在调用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];

我在调用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);
}
#包括
使用名称空间std;
int size=5;
无效分配(整数*t,字符**&a){
t=新整数[大小];
a=新字符*[大小];
对于(int i=0;icout你可以在任何地方调用
delete[]
。你的问题要简单得多。你的代码中有一个缺陷

分配一个长度为
size
的数组。然后递增
size
。然后执行以下操作:

for(int i = 0; i < size; ++i)
    delete [] a[i];
显然,您不会在此函数之外修改
size

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];
}
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);
}
再进一步,您可以选择如下方式处理分配:

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];
}
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);
}
size\u t size=5;
无效分配(字符**&a,大小\u t新闻大小){
大小=新闻大小;
a=新字符*[大小];
对于(int i=0;i

尽管如此,坦率地说,您的整个程序都是一场灾难。还有许多其他错误我在回答中没有提到。请使用标准容器,如
std::vector
std::string
。标准容器将处理内存分配的详细信息,并将正确地执行此操作。

谢谢,现在它运行良好。如果我可以问一下,我的代码有什么可怕的地方吗使用全局变量。2.泄漏。3.使用
int
而不是
size\t
。4.使用原始分配而不是STL容器。5.参数
t
alloc
没有任何用途。调用者看不到
alloc
中分配的值。为什么STL容器比原始分配好得多?以及全局变量和未使用的t变量,这个程序就像测试一样,我通常会做这样的事情,所以你可以原谅我这个。STL容器是已知的可以工作的。你的代码不工作。STL容器很容易使用,导致代码精简易读。它们有强大的迭代器。基于内联原始分配的代码很难处理ntain并可能包含错误。您的代码泄漏。STL容器不会泄漏。STL容器很容易与其他代码组合。您的代码位于自己的孤岛中,除非您自己编写,否则无法与任何其他内容交互。