排序ContactInfo对象数组时程序异常终止问题求助
嘿,我来帮你搞定这个崩溃问题!先看你给出的代码和错误信息,核心问题其实很清晰,咱们一步步分析:
问题重现
你定义了一个存储联系人信息的类:
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

