所以我宣布了一个类似于
的指针数组Items* _items[ARRSIZE];
基本上,目标是将它们用作对象数组(一个用于肉类,一个用于生产),这是在运行时动态决定的。我在构造函数中调用了以下函数,并且我已经将它识别为在主函数之前保持segfaulting的原因。
void Inventory::loadRecs(){
datafile.open(_filename);
int i = 0;
char c;
//create fileif it doesnt exist
if(datafile.fail()){
datafile.clear();
datafile.close();
datafile.open(_filename, ios::out);
datafile.close();
}
else{
//read from file
while(!datafile.eof()){
if(_items[i] != nullptr){
delete _items[i];
}
c = datafile.get();
if(c == 'P'){
_items[i] = new Produce;
}
if (c == 'M'){
_items[i] = new Meat;
}
datafile.ignore();
_items[i]->load(datafile);
i++;
datafile.ignore(); //ignore endl
}
_noOfItems = i;
datafile.close();
}
}
我正在阅读的文本文件非常简单,类似于
P,123,胡萝卜,0.66,[换行] 第一个字符标识它是什么类型的产品(肉或产品),并且使用加载功能读入该行的其余部分。
我的库存类看起来像这样:
class Inventory{
char _filename[256];
Item* _items[5];
std::fstream datafile;
int _noOfItems;
}
构造函数只是初始化所有内容并调用loadsRecs(这是我从中获取segfault的地方)
答案 0 :(得分:0)
我愿意打赌你没有初始化你的指针数组,因此对nullptr
的检查失败了,你在垃圾指针上调用delete
导致了未定义的行为。
除非您的代码中省略了构造函数,否则指针为default initialized会导致不确定的值。
因为在您展示的代码中,您使用的是new Produce;
和new Meat;
,我假设您已经写过new Inventory;
或Inventory i;
。相反,如果你包括括号(或C ++ 11中的大括号),如new Produce();
或Inventory i{};
,你会得到value initialization,它会指向zero initialization你的指针。这会导致您看似期望的行为。