从读取到对象指针数组的文件获取段错误

Getting a segfault from a file read to an array of object pointers?

本文关键字:段错误 获取 错误 文件 读取 对象 指针 数组      更新时间:2023-10-16

所以我声明了一个指针数组,看起来像

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{};,您将获得值初始化,这将对指针进行零初始化。这将导致您似乎期望的行为。