Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对指针向量进行排序工作一次,然后崩溃为;“无法读取内存”;_C++_Sorting_Pointers_Vector - Fatal编程技术网

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]++;