使用 delete-operator 时程序停止工作
Program stops working when using delete-operator
我是使用删除运算符的新手,我对为什么我的程序在尝试从指针数组中删除元素时一直崩溃感到有点困惑。它在两次删除时崩溃,我注释掉了另一个 for 循环来测试它。
int main()
{
char ** str_array = nullptr;
char * str = nullptr;
char delimiter = ' ';
int arraySize = 0;
str = new char [51];
cout << "Enter a string" << endl;
cin.clear();
cin.ignore( cin.rdbuf() -> in_avail() );
cin.getline(str, 50);
cin.clear();
arraySize = StrToArray(str_array, str, delimiter);
for (int i = 0; i < arraySize; i++)
{
cout << str_array[i] << endl;
}
for (int i = 0; i < arraySize; ++i)
{
delete [] str_array[i];
}
delete [] str_array;
return 0;
}
这是我用来初始化的函数 str_array。
int StrToArray(char **& str_array, char * str, char delimiter)
{
int size = 0;
int arraySize = 0;
int start = 0;
for (int i = 0; i < strlen(str); i++)
{
if (str[i] == ' ')
{
size++;
if (str[i + 1] == '[=11=]' || str[i + 1] == ' ')
{
size--;
}
}
}
str_array = new char * [size];
for (int i = 0; i < strlen(str) + 1; i++)
{
if ((str[i] == ' ' || str[i] == '[=11=]') && !(str[i + 1] == '[=11=]' || str[i + 1] == ' '))
{
str_array[arraySize] = new char[i-start];
arraySize++;
for (int x = 0; x <= i - start; x++)
{
str_array[arraySize-1][x] = str[x + start];
if (x == i-start)
{
str_array[arraySize - 1][x] = '[=11=]';
}
}
i++;
start = i;
}
}
return (size + 1);
}
我的str_array
被初始化为一个指针数组,每个指针指向一个cString。
我想要做的是删除数组的每个元素,然后删除数组本身。但是,每次我尝试执行任何一个删除运算符时,我的代码都会崩溃。
你的str_array
和str_array[i]
都是数组,你应该使用delete[]
运算符来释放它们。请参阅下面的简单示例。
void f(size_t size)
{
char** str_array = new char* [size];
for (int i = 0; i < size; ++i) {
str_array[i] = new char[i];
}
for (int j = 0; j < size; ++j) {
delete[] str_array[j];
}
delete[] str_array;
}
我可以看到两个错误,都是 'off by one' 个错误
str_array[arraySize] = new char[i-start];
应该是
str_array[arraySize] = new char[i-start+1];
您没有为 nul 终止符留出足够的空间。
和
str_array = new char * [size];
应该是
str_array = new char * [size+1];
因为空格数比字数少1
我用 "hello world" 进行了测试,并且对你的代码 运行 进行了这两项更改。
哦,alijandro 所做的更正也是正确的,但对我来说并没有导致任何崩溃。
我是使用删除运算符的新手,我对为什么我的程序在尝试从指针数组中删除元素时一直崩溃感到有点困惑。它在两次删除时崩溃,我注释掉了另一个 for 循环来测试它。
int main()
{
char ** str_array = nullptr;
char * str = nullptr;
char delimiter = ' ';
int arraySize = 0;
str = new char [51];
cout << "Enter a string" << endl;
cin.clear();
cin.ignore( cin.rdbuf() -> in_avail() );
cin.getline(str, 50);
cin.clear();
arraySize = StrToArray(str_array, str, delimiter);
for (int i = 0; i < arraySize; i++)
{
cout << str_array[i] << endl;
}
for (int i = 0; i < arraySize; ++i)
{
delete [] str_array[i];
}
delete [] str_array;
return 0;
}
这是我用来初始化的函数 str_array。
int StrToArray(char **& str_array, char * str, char delimiter)
{
int size = 0;
int arraySize = 0;
int start = 0;
for (int i = 0; i < strlen(str); i++)
{
if (str[i] == ' ')
{
size++;
if (str[i + 1] == '[=11=]' || str[i + 1] == ' ')
{
size--;
}
}
}
str_array = new char * [size];
for (int i = 0; i < strlen(str) + 1; i++)
{
if ((str[i] == ' ' || str[i] == '[=11=]') && !(str[i + 1] == '[=11=]' || str[i + 1] == ' '))
{
str_array[arraySize] = new char[i-start];
arraySize++;
for (int x = 0; x <= i - start; x++)
{
str_array[arraySize-1][x] = str[x + start];
if (x == i-start)
{
str_array[arraySize - 1][x] = '[=11=]';
}
}
i++;
start = i;
}
}
return (size + 1);
}
我的str_array
被初始化为一个指针数组,每个指针指向一个cString。
我想要做的是删除数组的每个元素,然后删除数组本身。但是,每次我尝试执行任何一个删除运算符时,我的代码都会崩溃。
你的str_array
和str_array[i]
都是数组,你应该使用delete[]
运算符来释放它们。请参阅下面的简单示例。
void f(size_t size)
{
char** str_array = new char* [size];
for (int i = 0; i < size; ++i) {
str_array[i] = new char[i];
}
for (int j = 0; j < size; ++j) {
delete[] str_array[j];
}
delete[] str_array;
}
我可以看到两个错误,都是 'off by one' 个错误
str_array[arraySize] = new char[i-start];
应该是
str_array[arraySize] = new char[i-start+1];
您没有为 nul 终止符留出足够的空间。
和
str_array = new char * [size];
应该是
str_array = new char * [size+1];
因为空格数比字数少1
我用 "hello world" 进行了测试,并且对你的代码 运行 进行了这两项更改。
哦,alijandro 所做的更正也是正确的,但对我来说并没有导致任何崩溃。