std :: map вставка ошибки сегментации - PullRequest
2 голосов
/ 31 мая 2010

Почему этот код останавливается из-за ошибки сегментации:

class MapFile
{
 public:
   /* ... */
   std::map <unsigned int, unsigned int> inToOut;
};

bool MapFile::LoadMapFile( const wxString& fileName )
{
    /* ... */
   inToOut.insert( std::make_pair(input,output) );
}

но когда я ставлю "std :: map inToOut;" как раз перед "inToOut.insert" он работает просто отлично:

class MapFile
{
 public:
   /* ... */
};

bool MapFile::LoadMapFile( const wxString& fileName )
{
    /* ... */
   std::map <unsigned int, unsigned int> inToOut;
   inToOut.insert( std::make_pair(input,output) );
}


OK. Спасибо, ребята, похоже, что я исправил эту проблему благодаря вашей помощи.

Проблема была в той части кода, где я вызывал LoadMapFile:

void WizardProductPage::OnTestButtonMapFile( wxCommandEvent& event )
{
   wxString filename;
   filename = locMapFile->GetValue();

   MapFile::LoadMapFile( filename );
}

Должно быть:

void WizardProductPage::OnTestButtonMapFile( wxCommandEvent& event )
{
   wxString filename;
   filename = locMapFile->GetValue();

   MapFile mapFile;
   mapFile.LoadMapFile( filename );
}

Ответы [ 5 ]

3 голосов
/ 31 мая 2010

Полагаю, ваша проблема в другом месте. Следующий код работает нормально:

class MapFile
{
public:
   std::map <unsigned int, unsigned int> inToOut;
   void LoadMapFile();
};

void MapFile::LoadMapFile()
{
   inToOut.insert( std::make_pair(1, 1) );
}

int main() {
   MapFile a;
   a.LoadMapFile();

   return 0;
}

Попробуйте пошаговую отладку или опубликуйте здесь весь код, потому что в этом нет проблем.

Также да. Если вы пытаетесь выполнить эту операцию одновременно из разных потоков без блокировки, это может вызвать ошибку segfault.

2 голосов
/ 31 мая 2010

Скорее всего, у вас переполнение буфера или неверный указатель, из-за которого вы удалили карту, когда она является членом вашего класса. Когда у вас есть класс автоматической переменной, он находится где-то в памяти, а ваша первоначальная ошибка уничтожает какой-то другой фрагмент памяти.

Вы должны запускать свой код в отладчике памяти. Если вы работаете в Linux, я бы порекомендовал Valgrind

1 голос
/ 11 июня 2013

Другой причиной такой проблемы может быть использование карты с пользовательским компаратором и / или распределителем и не инициализация карты соответствующим образом, что может генерировать ошибки сегментации в любой случайной точке, то есть: первая вставка могла бы работать отлично, но при второй, когда вызывается функция сравнения, может быть ошибка сегментации.

1 голос
/ 31 мая 2010

Возможно, вы вызвали функцию-член для объекта, который был удален.

например.

MapFile *p;
{
  MapFile a;
  p = &a;
}

p->LoadMapFile("test.map");

выдаст ошибку, которую вы описали. Во втором случае это не так, поскольку вы не разыменовываете указатель this в любое время.

edit: Возможно, нет, в случае если входные, выходные переменные являются данными-членами, мой ответ будет неверным.

1 голос
/ 31 мая 2010

Возможно, ваше приложение многопоточное, и вы не блокируете вставку в map. Второй вариант не разделяет map с другими потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...