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

时间:2015-04-29 02:26:18

标签: c++ arrays pointers initialization

所以我宣布了一个类似于

的指针数组
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的地方)

1 个答案:

答案 0 :(得分:0)

我愿意打赌你没有初始化你的指针数组,因此对nullptr的检查失败了,你在垃圾指针上调用delete导致了未定义的行为。

除非您的代码中省略了构造函数,否则指针为default initialized会导致不确定的值。

因为在您展示的代码中,您使用的是new Produce;new Meat;,我假设您已经写过new Inventory;Inventory i;。相反,如果你包括括号(或C ++ 11中的大括号),如new Produce();Inventory i{};,你会得到value initialization,它会指向zero initialization你的指针。这会导致您看似期望的行为。