2015-04-29 28 views
-1

所以我宣布指针看起来像从读取的文件中获取段错误到对象指针数组?

Items* _items[ARRSIZE]; 

基本上用它们作为对象(一个用于肉,一个用于生产)阵列的目标数组,它是在运行时动态决定。我在构造函数中调用以下函数,并将其标识为我在main函数之前保留段落的原因。

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,[NEWLINE] 第一个字符识别它是什么样的产品(肉或产生),并用加载函数读入该行的其余部分。

我的清单类看起来是这样的:

class Inventory{ 
    char _filename[256]; 
    Item* _items[5]; 
    std::fstream datafile; 
    int _noOfItems; 
} 

而构造方法仅初始化一切,并呼吁loadsRecs(这是我从我段错误)

+0

'Item :: load()'是怎么样的? – timrau

+0

[不要使用datafile.eof(),它可能与你的问题有关。](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-认为是错误的) – dwcanillas

+0

此外,最好使用RAII而不是明确的调用“open”和“close”。 – b4hand

回答

0

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

除非你有一个你从代码中省略的构造函数,否则指针是default initialized会导致不确定的值。

由于在您显示的代码中,您使用的是new Produce;new Meat;,我假定您已经编写了new Inventory;Inventory i;。相反,如果你包含括号(或括号在C++ 11中),例如new Produce();Inventory i{};,你会得到value initialization这将做你的指针zero initialization。这会导致你看似期待的行为。

+0

不会物品_items [5];初始化它们? – user3551329

+1

在C++ 11中,数组的[默认初始化](http://en.cppreference.com/w/cpp/language/default_initialization)对值进行默认初始化。在这种情况下,你的值是指针*而不是*对象。因此,它们被初始化为不确定的值,假设你的'Inventory'对象被默认初始化。 – b4hand