尝试从指针向量中取消引用指针的分段错误

时间:2011-10-04 13:41:35

标签: c++ pointers stdvector

我有一个指向对象的指针向量,我正在使用std :: vector :: iterator`进行迭代。由于返回的元素本身就是一个指针,我将迭代器取消引用两次,一次返回指针,一次解析指向实际对象的指针。

我正在尝试调用一个返回std :: string的成员函数(getClass),我已经尝试了(**it).getClass()(*it)->getClass(),但两者都给了我一个分段错误。我一直觉得我错过了一些明显的东西。

部分功能代码:

void dataSet::createFolds()
{
   // Shuffle the data vector
   std::random_shuffle( m_records.begin(), m_records.end());

   std::cout << "STARTING MAIN LOOP.  THERE ARE " << m_records.size() << " RECORDS\n";
   // iterate through the data vector and assign each to a fold
   std::vector<dataRecord *>::iterator it = m_records.begin();
   while (it != m_records.end())
   {
      std::string currentClass = (*it)->getClass();  // SEG FAULT HERE
      .
      .
      .
   }
   .
   .
   .
}

向量是m_records ... code

dataRecord定义如下...... code

回答关于填充载体的问题:

数据是从文本文件中读取的,我真的不想发布整个事情,除非我必须(212行),但填充矢量的相关代码如下。 dataRecord对象的构造函数采用字段对象的向量。我使用临时指针,使用new创建对象,然后push_back指针。

while ...
{
   std::vector<field> fields;

   // build the fields vector
   for (unsigned int i = 0; i < numAttribs; ++i)
      fields.push_back(field(data.at(i), attribTypes[i]));

   // create the new dataRecord
   dataRecord * newRecord = new dataRecord(fields);

   // add the record to the set
   m_records.push_back(newRecord);

   ++recordNum;
   std::cout << "read record " << recordNum << std::endl;
}

4 个答案:

答案 0 :(得分:0)

容器中的指针都是null,或者是指向freed memory的指针。

仔细检查填充m_records的代码。

答案 1 :(得分:0)

在我看来,矢量元素被初始化严重。也许你必须在测试之前独立地测试填充向量的代码以提取它们。对不起,我的英文;)

答案 2 :(得分:0)

std::string dataRecord::getClass() {return m_data.at(m_data.size() - 1).getTextData();}

您必须验证m_data.size(),因为它可能为0,因此您将获得out或range的异常。

答案 3 :(得分:0)

// create the new dataRecord
   dataRecord * newRecord = new dataRecord(fields);

我猜这个bug是在dataRecord的构造函数中。你确定它能正常工作吗?