C++ 对指针向量进行排序工作一次,然后崩溃为;“无法读取内存”;
我有一个C++ 对指针向量进行排序工作一次,然后崩溃为;“无法读取内存”;,c++,sorting,pointers,vector,C++,Sorting,Pointers,Vector,我有一个飞行指针的向量,我将其传递到一个函数中,以便在屏幕上进行排序和显示。我正在使用飞行类中的函子进行排序。它第一次工作得很完美,然后在sortCriteria增加后,当它第二次尝试跨过飞行向量时崩溃。 我得到的错误是访问冲突读取位置0x013DFFFC,因此我打赌这与向量在第一次排序后失去对其内存位置的跟踪有关。提前感谢您提供的任何帮助。 这是我的排序功能: //this function displays the flight schedule and sorts it by any fi
飞行指针的向量
,我将其传递到一个函数中,以便在屏幕上进行排序和显示。我正在使用飞行类中的函子进行排序。它第一次工作得很完美,然后在sortCriteria增加后,当它第二次尝试跨过飞行向量时崩溃。
我得到的错误是访问冲突读取位置0x013DFFFC
,因此我打赌这与向量在第一次排序后失去对其内存位置的跟踪有关。提前感谢您提供的任何帮助。
这是我的排序功能:
//this function displays the flight schedule and sorts it by any field
void showFlightSchedule(vector<Flight*>& flights)
{
//declare local variables
char choice = ' ';
int sortCriteria = 1;
while (toupper(choice) != 'X')
{
//choosing which field to sort the schedule by
switch (sortCriteria)
{
case 1:
sort (flights.begin(), flights.end(), Flight::SortByDepartCity);
break;
case 2:
sort (flights.begin(), flights.end(), Flight::SortByDestinationCity);
break;
case 3:
sort (flights.begin(), flights.end(), Flight::SortByDepartTime);
break;
case 4:
sort (flights.begin(), flights.end(), Flight::SortByArrivalTime);
break;
case 5:
sort (flights.begin(), flights.end(), Flight::SortByFlightNumber);
break;
case 6:
sort (flights.begin(), flights.end(), Flight::SortByAircraftType);
break;
case 7:
sort (flights.begin(), flights.end(), Flight::SortByFreqFlyPoints);
break;
case 8:
sort (flights.begin(), flights.end(), Flight::SortByFlightFull);
break;
}
//display header
system("cls");
cout << left << endl;
cout << " " << setw(7) << "From" << setw(6) << "To" << setw(8) << "Depart" << setw(8) << "Arrive" <<
setw(8) << "Flight" << setw(12) << "Aircraft" << setw(12) << "Frequent" << setw(6) << "Flight\n";
cout << "\t\t\t\t " << setw(10) << "Number" << setw(8) << "Type" << setw(14) << "Flyer Points" << setw(6) << "Status\n";
//slightly altering the header to indicate how the list is sorted
switch (sortCriteria)
{
case 1:
cout << " --\\_/------------------------------------------------------------------\n\n";
break;
case 2:
cout << " ---------\\_/-----------------------------------------------------------\n\n";
break;
case 3:
cout << " ----------------\\_/----------------------------------------------------\n\n";
break;
case 4:
cout << " ------------------------\\_/--------------------------------------------\n\n";
break;
case 5:
cout << " --------------------------------\\_/------------------------------------\n\n";
break;
case 6:
cout << " -----------------------------------------\\_/---------------------------\n\n";
break;
case 7:
cout << " -----------------------------------------------------\\_/---------------\n\n";
break;
case 8:
cout << " ----------------------------------------------------------------\\_/----\n\n";
break;
}
//step through the flights vector displaying the information
for (int idx = 0; idx < flights.size(); idx++)
{
cout << " " << setw(7) << flights[idx]->getDepartCity() << setw(6) << flights[idx]->getDestinationCity() << setw(8) <<
flights[idx]->getDepartTime() << setw(9) << flights[idx]->getArrivalTime() << setw(10) << flights[idx]->getFlightNumber() << setw(11) <<
flights[idx]->getAircraftType() << setw(11) << flights[idx]->getFreqFlyPoints();
if (flights[idx]->getFlightFull())
cout << setw(6) << "FULL\n\n";
else
cout << endl << endl;
flights[idx]++;
}
//display footer
cout << " -----------------------------------------------------------------------\n\n";
cout << "\t\t\t C -- Change Sorting\n";
cout << "\t\t\t X -- Exit to Main Menu\n";
cout << "\t\t\t Enter C or X: ";
//get choice from user
cin >> choice;
//error-trapping loop
while ((toupper(choice) != 'C') && (toupper(choice) != 'X'))
{
cout << "Please choose \"C\" or \"X\": ";
cin >> choice;
}
//changing the sort flag
if (sortCriteria == 8)
sortCriteria = 1;
else
sortCriteria++;
}
}
//此函数显示航班时刻表并按任何字段进行排序
作废showFlightSchedule(矢量和航班)
{
//声明局部变量
字符选择=“”;
int-sortCriteria=1;
while(toupper(choice)!=“X”)
{
//选择按哪个字段对计划进行排序
开关(sortCriteria)
{
案例1:
排序(flights.begin()、flights.end()、flights::SortByDepartCity);
打破
案例2:
排序(flights.begin()、flights.end()、flights::SortByDestinationCity);
打破
案例3:
排序(flights.begin()、flights.end()、flights::SortByDepartTime);
打破
案例4:
排序(flights.begin()、flights.end()、flights::sortbyarravilime);
打破
案例5:
排序(flights.begin()、flights.end()、flights::SortByFlightNumber);
打破
案例6:
排序(flights.begin()、flights.end()、flights::SortByAircraftType);
打破
案例7:
排序(flights.begin()、flights.end()、flights::SortByFreqFlyPoints);
打破
案例8:
排序(flights.begin()、flights.end()、flights::SortByFlightFull);
打破
}
//显示标题
系统(“cls”);
无法删除此项
航班[idx]++
在打印循环的最后一行
这里有一些代码可以简化你的代码
template< class T, class FieldType, FieldType T::*FieldPtr >
struct LessBy {
bool operator()( const T * left, const T * right ) const {
return left->*FieldPtr < right->*FieldPtr;
}
};
typedef LessBy< Flight, std::string, & Flight::departCity > SortByDepartCity;
typedef LessBy< Flight, std::string, & Flight::destinationCity > SortByDestinationCity;
//and so on
模板
结构莱斯比{
布尔运算符()(常数T*左,常数T*右)常数{
返回左->*FieldPtr<右->*FieldPtr;
}
};
typedef LessBySortByDepartCity;
typedef LessBySortByDestinationCity;
//等等
打印时执行的这一行:
flights[idx]++;
将修改每个指针,几乎肯定会使每个指针对取消引用无效。
您应该删除它。(它看起来像是旧代码中留下的一行。)
将排序与打印分离也是一个好主意,因为没有人希望输出函数修改它打印的数据
除非你有很好的理由,否则无论如何,你不应该使用指向航班的指针。TL;DR.你确定向量中的所有指针都是有效的吗?如果其中一个无效,你将得到未定义的行为。向量围绕一堆内存地址移动,就是这样。你不会期望int向量改变它的elements.flights[idx]+;
-这是什么??(打印循环中的最后一行)嗯…是的。这就是问题所在。也许我应该回顾一下循环的章节,提醒自己今后不要加倍增加。非常感谢。
flights[idx]++;