集成开发环境
代码块
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并导致此处的段错误