You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除动态分配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:46:04