我在函数中调用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);
}
答案 0 :(得分:2)
您可以从任何地方拨打delete[]
。你的问题更加平淡无奇。你的代码中只有一个缺陷。
您分配一个长度为size
的数组。然后你增加size
。然后你这样做:
for(int i = 0; i < size; ++i)
delete [] a[i];
因为你已经增加了size
,你的循环就会在a
的末尾运行。您需要使用与分配数组时使用的size
相同的值。
很明显,以下是执行流程:
size
已分配给值5
。a
的分配长度为5
。size
会增加到值10
。for
到0
运行size-1
循环,即0
到9
,并致电delete[] a[i]
。显然,5
到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::vector
和std::string
等标准容器。标准容器将处理内存分配的细节,并将正确执行。