从读取到对象指针数组的文件获取段错误
Getting a segfault from a file read to an array of object pointers?
所以我声明了一个指针数组,看起来像
Items* _items[ARRSIZE];
基本上的目标是将它们用作一个对象数组(一个用于肉类,一个用于农产品),该数组在运行时动态决定。 我在我的构造函数中调用以下函数,我已经确定它是我在主函数之前不断出现段错误的原因。
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(这是我从中得到我的段错误的地方)
我敢打赌,你没有初始化你的指针数组,所以你对nullptr
的检查失败了,你正在垃圾指针上调用delete
,导致未定义的行为。
除非有从代码中省略的构造函数,否则指针将默认初始化,从而导致不确定的值。
由于在您展示的代码中,您使用的是new Produce;
和new Meat;
,因此我假设您已经编写了new Inventory;
或Inventory i;
。相反,如果您包含括号(或 C++11 中的大括号),如 new Produce();
或 Inventory i{};
,您将获得值初始化,这将对指针进行零初始化。这将导致您似乎期望的行为。
相关文章:
- 为什么PyImport_ImportModule python 3.7.2 中出现段错误?
- 为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?
- 全局向量导致 C++ 程序结束时出现段错误
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 更改条件段错误
- 使用 TTF_RenderText() 加载字体时获取段错误 TTF_OpenFontRW()
- 注册对对象工厂的调用会导致段错误
- Assimp 库错误:获取打包成员的地址
- pthread_create在构造函数段错误中
- Nanoflann发现邻居提出段错误
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 具有unique_ptr的 CRTP 会导致段错误
- 增强纤维work_stealing屏障会导致段错误
- 当我返回指向结构的指针向量时出现段错误
- C++为什么我的代码没有爆炸/段错误?
- Pthread段错误,使用指向main中变量的指针
- C++ 模板中的段错误
- 创建指针 C++ 时获取段错误
- 从读取到对象指针数组的文件获取段错误
- 获取浮点模板参数工作编译的"hack",但在 g++ 和 clang 上都存在段错误