类参数字符串排序失效及delete[]释放数组报错解决方案咨询
问题解决:标题排序失效 + delete 报错
嘿,我来帮你搞定这两个问题,咱们一步步来捋清楚:
1. 标题排序失效的原因及修复
你的Title函数完全写错了!看video.cpp里的代码,居然在比较时长而不是标题,这肯定没法按标题排序。另外,Video类里还存在冗余的成员变量(比如同时有m_title和title),很容易导致变量混淆,比如print函数用的是title,但排序函数用的是m_title,虽然构造函数里做了赋值,但完全没必要重复定义。
修复步骤:
第一步:清理冗余成员变量
修改video.h的私有成员,只保留一套统一命名的变量:
private: string m_title; string m_link; string m_comment; double m_length; int m_rating;
第二步:修正构造函数
去掉冗余的赋值操作,直接用初始化列表完成成员初始化:
Video::Video(string video_title, string video_link, string video_comment, double video_length, int video_number) : m_title(video_title), m_link(video_link), m_comment(video_comment), m_length(video_length), m_rating(video_number) { // 这里不需要额外赋值,初始化列表已经搞定 }
第三步:修正Title排序函数
改成比较标题字符串,和你之前的评分、时长排序逻辑保持一致(降序排列):
bool Video::Title(Video *other3) { // 字符串直接用>比较,会按字典序判断大小 return m_title > other3->m_title; }
第四步:修正print函数
把里面的成员变量改成统一的m_前缀,避免变量混淆:
void Video::print(){ string star; switch(m_rating){ case 1: star = "*"; break; case 2: star = "**"; break; case 3: star = "***"; break; case 4: star = "****"; break; case 5: star = "*****"; break; } cout << m_title << ", " << m_link << ", " << m_comment << ", " << m_length << ", " << star << endl; }
2. delete[] videoObj报错的原因及修复
videoObj是一个栈上的指针数组(Video *videoObj[100];),而delete[]只能用来释放堆上分配的数组(比如Video** videoObj = new Video*[100];)。你真正需要释放的是数组里每个元素指向的Video对象(这些是用new在堆上分配的),而不是数组本身。
修复方法:
遍历数组,逐个释放每个Video对象:
// 在print之后、return之前添加这段代码 for(int i = 0; i < last; i++){ delete videoObj[i]; // 释放每个new出来的Video实例 } // 删掉错误的delete[] videoObj; 语句
额外的逻辑bug:排序后的输出只会在标题排序时执行
你main函数里的三个排序if是嵌套的!这导致只有当user=="title"时才会执行输出,其他排序方式下根本不会打印结果。需要把三个if改成互斥的else if,然后把输出代码放在外面:
// 修正后的排序逻辑 if(user=="rating"){ // 评分排序代码 } else if(user=="length"){ // 时长排序代码 } else if(user=="title"){ // 标题排序代码 } // 统一输出,不管哪种排序方式都执行 for(int i= 0; i < last; i++){ videoObj[i]->print(); } // 释放资源 for(int i = 0; i < last; i++){ delete videoObj[i]; } return 0;
这样修改后,你的程序应该就能正常按标题排序,也不会出现delete报错的问题了!
内容的提问来源于stack exchange,提问作者Fooji
相关产品推荐
相关产品推荐

