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

类参数字符串排序失效及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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:12:45