删除动态分配C字符串时程序崩溃求助
问题分析与解决方案
兄弟,你的程序崩溃原因太典型了——你在尝试用delete[]释放栈上的数组,这完全违背了C++的内存规则!
先看你代码里的关键细节:你声明的tempString是栈上的固定大小数组(char tempString[ARRAY_CONST];),栈内存是由系统自动管理的,函数执行完它会自己销毁,根本轮不到你用delete[]去碰它。delete[]只能用来释放通过new[]在堆上分配的内存,乱删栈内存必然导致程序崩溃。
你大概率犯了这个错误
从你的代码片段推测,你可能写了类似这样的错误代码:
char tempString[ARRAY_CONST]; // 读取输入到tempString里 cin.getline(tempString, ARRAY_CONST, '\n'); // 然后错误地执行了这句: delete[] tempString; // 这里直接崩!
或者可能你混淆了栈数组和堆分配的指针,把栈数组的地址当成了new[]出来的指针去释放,这都是绝对禁止的操作。
正确的处理方式
- 栈数组不用手动释放:对于
char tempString[ARRAY_CONST];这种栈上的变量,你啥都不用管,函数结束时系统会自动回收它的内存。 - 只释放你自己new[]的内存:如果你是为了存储输入内容,用
new[]分配了堆内存(比如char *dynamicName = new char[strlen(tempString)+1];),那在不需要这个动态字符串的时候,必须用delete[] dynamicName;来释放,但栈数组绝对不能这么操作。
修复后的完整代码示例
假设你原本想把输入的名字存到group对象的动态字符串成员里,正确的写法应该是这样:
#include "group.h" #include <iostream> #include <cstring> // 别忘了包含strlen、strcpy的头文件 using namespace std; void addGroup() { group *newGroup = new group; char option; // 你之前漏了声明option变量吧? cin >> option; cin.ignore(100, '\n'); // 修正换行符的写法,应该是'\n' if (option == 'Y' || option == 'y') { cout << "Enter name: "; char tempString[ARRAY_CONST]; cin.getline(tempString, ARRAY_CONST, '\n'); // 为名字分配堆内存,要留一个字节存字符串结束符'\0' char *groupName = new char[strlen(tempString) + 1]; strcpy(groupName, tempString); // 把动态字符串赋值给group对象的成员(假设group有char* name成员) newGroup->name = groupName; // 注意:之后销毁newGroup的时候,一定要记得delete[]它的name成员 // 但tempString是栈数组,绝对不能delete! } // ... 其他业务逻辑 }
额外加分建议
如果你的项目允许,直接用C++的std::string代替手动管理C字符串吧!它会自动处理内存的分配和释放,不仅能彻底避免这类内存错误,代码还会简洁很多:
#include "group.h" #include <iostream> #include <string> using namespace std; void addGroup() { group *newGroup = new group; char option; cin >> option; cin.ignore(100, '\n'); if (option == 'Y' || option == 'y') { cout << "Enter name: "; string groupName; getline(cin, groupName); // 只要把group类的name成员改成std::string类型,直接赋值就行 // newGroup->name = groupName; // 完全不用操心内存释放的问题,爽得很! } }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

