Ошибка сегментации при попытке разыменования указателя от вектора указателей - PullRequest
2 голосов
/ 04 октября 2011

У меня есть вектор указателей на объекты, которые я перебираю, используя std :: vector :: iterator`. Поскольку возвращаемый элемент сам является указателем, я разыменовываю итератор дважды, один раз для возврата указателя и один раз для разрешения указателя на реальный объект.

Я пытаюсь вызвать функцию-член (getClass), которая возвращает std :: string, и я пробовал и (**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 ... код

dataRecord определяется следующим образом ... код

В ответ на вопросы о заполнении вектора:

Данные читаются из текстового файла, и я действительно не хочу публиковать все целиком, если мне не нужно (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 голосов
/ 04 октября 2011
// create the new dataRecord
   dataRecord * newRecord = new dataRecord(fields);

Я предполагаю, что ошибка в конструкторе dataRecord. Вы уверены, что он делает свою работу правильно?

0 голосов
/ 04 октября 2011

На мой взгляд, векторные элементы плохо инициализированы. Возможно, вам придется протестировать код, который заполняет вектор независимо, прежде чем тестировать, чтобы извлечь их. Извините за мой английский;)

0 голосов
/ 04 октября 2011

В

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

Вы должны проверить m_data.size (), потому что это может быть 0, поэтому вы получите исключение out или range.

0 голосов
/ 04 октября 2011

Либо указатели в ваших контейнерах равны нулю, либо они свисают указатели на свободную память.

Дважды проверьте код, который заполняет m_records.

...