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

排序ContactInfo对象数组时程序异常终止问题求助

解决C++通讯录排序时的std::logic_error崩溃问题

嘿,我来帮你搞定这个崩溃问题!先看你给出的代码和错误信息,核心问题其实很清晰,咱们一步步分析:

问题重现

你定义了一个存储联系人信息的类:

class ContactInfo { 
private: 
    string contactName; 
    string contactNumber; 
public: 
    ContactInfo() { 
        contactName = ""; 
        contactNumber = ""; 
    } 
    // setter and getters 
}; 

然后写了一个按姓名排序的函数:

void sortListByName(ContactInfo contactList[], int listSize) { 
    for(int i = 0; i < listSize; i++) { 
        for(int j = i+1; j < listSize+1; j++) { 
            if(contactList[i].getContactName() > contactList[j].getContactName()) { 
                ContactInfo temp = contactList[j]; 
                contactList[i] = contactList[j]; 
                contactList[j] = temp; 
            } 
        } 
    } 
} 

主函数中创建数组并调用排序后,程序抛出了错误:

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 
terminate called after throwing an instance of 'std::logic_error' 
what(): basic_string::_M_construct null not valid

核心问题:数组越界访问

你的排序函数里有一个致命的错误——内层循环越界了!看这段代码:

for(int j = i+1; j < listSize+1; j++)

数组的有效下标范围是0到listSize-1,但这里j的上限是listSize+1,当j等于listSize时,你访问的contactList[j]已经是数组之外的内存了。这块内存是未初始化的,里面的contactName字符串很可能是无效的空指针,调用getContactName()时就会触发std::logic_error,也就是你看到的错误。

修复步骤1:修正循环边界

把内层循环的条件改成j < listSize,确保不会访问数组外的内存:

for(int j = i+1; j < listSize; j++)

次要问题:交换逻辑错误

另外,你的交换代码也有个小bug:

ContactInfo temp = contactList[j];
contactList[i] = contactList[j];
contactList[j] = temp;

这里你先把contactList[j]存到temp,然后直接把contactList[j]赋值给contactList[i],等于完全没用到contactList[i]的原始值,交换根本没生效。正确的交换应该是:

ContactInfo temp = contactList[i];
contactList[i] = contactList[j];
contactList[j] = temp;

或者更简洁地用C++标准库的std::swap(需要包含<algorithm>头文件):

std::swap(contactList[i], contactList[j]);

额外检查点:数组初始化

最后,还要确认你的contactList(n)函数是否正确分配并初始化了数组。如果是用new ContactInfo[size]分配的,那没问题——它会自动调用每个元素的默认构造函数,把contactName初始化为空字符串。但如果是手动分配内存却没有初始化,也可能导致类似的字符串构造错误,这一点要留意。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:57:11