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
相关产品推荐
相关产品推荐

