集成开发环境
代码块
mingw32-make 3.82.90

下面是我的程序的调用堆栈



问题发生在#3。以下是相关部分的代码段

1.导致SIGSEGV故障的方法

bool Shop::initItem()
{
    int count = 0, tempPrice;
    std::string input;
    std::stringstream tempSTRM;
    std::vector <Item>::iterator itemITR = menu.items.begin();
    Item tempITM;

    do
    {
        std::cout << "Input item name for item[" << count+1 << "]\t:\t";
        std::getline(std::cin, input);

        if(input == "0")
            break;

        tempITM.itemName = input;

        std::cout << "Input the price for the item[" << count+1 << "]\t:\t";
        std::getline(std::cin, input);

        tempSTRM.str(input);
        tempSTRM >> tempPrice;
        tempITM.price = tempPrice;

        menu.items.push_back(tempITM);

        tempITM = *itemITR; //this line is causing the problem
        std::cout << tempITM.itemName << "\t" << tempITM.price << "\n";

        itemITR++;
        count++;

    }while(input !="0");

    return false;
}

2.菜单结构
struct MenuItems
{
    std::string menuName;
    std::vector <Item> items;
};
typedef struct MenuItems Menu;

3.项目结构
    struct Item
{
    std::string itemName;
    int price;

    bool promoStatus;
    double promoDiscount;
};
typedef struct Item Item;

4 Main(仅那部分代码与我现在正在构建的内容有关)
#include <windows.h> //leftover code from previous experiment
#include <tchar.h>   //leftover code from previous experiment

#include "CoffeeShop.h"

using namespace std;

int main()
{
    Shop* CoffeeShop = new Shop();
//Other leftover codes
    return 0;
}

我的意图是:获得我想要推送的所有内容的输出(在构建项目时,一旦其他部分准备就绪,我就可以自信地产生输出。)

由于这引起了SIGSEGV问题,所以我目前的想法行不通。尝试通过放置一个指针对象Item并获得对itemITR的访问权限,但它也无法正常工作。任何人都可以阐明我(思想上)的错误,以及我该怎么做?

- 编辑 -
Shop::Shop()
{
    if(!initShop())
        std::cout << "Object creation succeeded!\n";
    else
        std::cout << "Object creation failed!\n";
}

bool Shop::initShop()
{
    if(!initMenu())
    {
        std::cout << "Object creation succeeded!\n";
        return false;
    }
    else
    {
        std::cout << "Object creation failed!\n";
        return true;
    }
}

bool Shop::initMenu()
{
    if(!initItem())
    {
        std::cout << "Object Creation succeeded!\n";
        return false;
    }
    else
    {
        std::cout << "Object creation failed!\n";
        return true;
    }
}

流程-> Shop构造函数调用initShop,然后initShop调用initMenu,initMenu调用initItem

商店-> initShop-> initMenu-> initItem

-编辑2--
解决了。添加
itemITR = menu.items.begin();

下线后
menu.items.push_back(tempITM);

谢谢!

最佳答案

您的迭代器使用给定的 vector 初始化:

std::vector <Item>::iterator itemITR = menu.items.begin();

然后,您可以在 vector 中插入一些内容:
    menu.items.push_back(tempITM);

might invalidate迭代器。所以取消引用它是UB并导致此处的段错误

09-26 06:22