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

C++中指向对象的二维动态指针数组正确释放方法

释放指向类对象的二维动态指针数组时触发段错误,且首行数据为空的问题

我在释放指向类对象的二维动态指针数组时遇到段错误,清楚new对应delete、new[]对应delete[]的规则,但不确定释放顺序是否存在问题。这是课程作业,禁止使用STL容器。

数组分配代码

我在堆上分配了一个1000行2列的指针数组:

Node*** arr_ptr = new Node**[1000];
for (int i = 0; i < 1000; i++) {
    arr_ptr[i] = new Node*[2];
    for (int j = 0; j < 2; j++) {
        arr_ptr[i][j] = new Node();
    }
}

释放代码及问题

我按照分配的逆顺序释放资源(先删对象指针,再删子数组,最后删外层数组),但仍触发段错误:

for (int i = 0; i < 1000; i++)
{
    for (int j = 0; j < 2; j++)
    {
        // 删除存储的对象指针
        delete arr_ptr[i][j];
    }
    // 删除子数组
    delete[] arr_ptr[i];
}
// 删除外层数组
delete[] arr_ptr;

// 将指针置空
arr_ptr = NULL;

尝试把delete改为delete[]后依旧报错,通过GDB调试发现,嵌套循环第一次执行delete arr_ptr[i][j];时就触发了段错误。

补充排查信息

经排查发现,数组中除[0][0]和[0][1]外,其他节点指针的数据均正常。负责创建数组和读取文件的代码如下:

void Language::initialize()
{

    // 提示用户输入文件名
    cout << "Name of language file to read in: ";
    cin >> file_name;


    // 打开文件准备读取
    file.open(file_name.c_str());

    // 读取语言名称和行数
    string language = "";
    file >> language;
    file >> count;

    // 创建count行2列的动态数组
    arr_ptr = new Node **[count];
    for (int i = 0; i < count; i++)
    {
        arr_ptr[i] = new Node*[2];

        for (int j = 0; j < 2; j++)
        {
            arr_ptr[i][j] = new Node();
        }
    }

    // 遍历文件,将数据写入数组
    // 第0列:德语 - 第1列:英语
    for (int i = 0; i < count; i++)
    {
        // 存储文件中的第i行
        string line_entry;

        // 读取一行
        getline(file, line_entry);

        // 拆分输入行
        string german = this->split(line_entry, "German");
        string english = this->split(line_entry, "English");

        // 将拆分后的内容存入对应数组位置
        arr_ptr[i][0]->data = german;
        arr_ptr[i][0]->index = i;
        arr_ptr[i][1]->data = english;
        arr_ptr[i][1]->index = i;
    }

    // 通知用户文件处理完成
    cout << "File successfully processed!" << endl;

    // 关闭文件
    file.close();
}

拆分字符串的split函数代码:

string Language::split(string s1, string s2)
{
    // 存储拆分后的子串
    string token = "";

    // 存储待拆分的行文本
    string line = s1;

    // 文件中使用的分隔符
    string delim = ",";

    // 指定要提取的语言对应的子串
    // "German":从开头到','的子串
    // "English":从','到末尾的子串
    string lang = s2;

    if (lang == "German")
    {
        // 找到分隔符的位置
        int pos = line.find(delim);

        // 提取从开头到分隔符的子串
        token = line.substr(0, pos);

        return token;
    }

    if (lang == "English")
    {
        // 找到分隔符的位置
        int pos = line.find(delim);

        // 提取从分隔符下一位到末尾的子串
        token = line.substr(pos + 1);

        return token;
    }

    // 未指定语言时返回空串
    return token;
}

我现在的疑惑是:为什么[0][0]和[0][1]的数据为空?推测是用>>读取前两个单词后,getline读取的第一行是空行,需要调整文件读取方式解决这个问题。

内容的提问来源于stack exchange,提问作者ox2afuu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:15:33