В моем коде есть vector <vector <vector <vector <std::tr1::shared_ptr<foo> > > > >
с именем foosBoxes
. Вложенный вектор играет роль имитации физического положения ящиков. У меня также есть цикл while, который вызывает ошибку сегментации:
vector<std::tr1::shared_ptr<foo> >::iterator fooit = foosBoxes[x][y][z].begin(); //x,y,z are valid integer
std::tr1::shared_ptr<foo> aFoo;
while (fooit != foosBoxes[x][y][z].end()){
aFoo = *fooit; //this cause segmentation fault
fooit++;
//some stuff which does not have an effect on fooit;
}
Некоторые вещи, которые я пробовал:
1. Я пытался использовать aFoo = *fooit++
, но это не сработало.
2. Ошибка сегментации возникает примерно после нескольких тысячных циклов, которые прошли нормально.
3. У меня есть попытался valgrind решить проблему, и valgrind выполнил этот шаг.
4. В цикле, в котором произошел сбой, я напечатал текущий счетчик до и после подозрительной строки. когда перед строкой я получаю 8 распечаток (размер вектора), а когда после - 7 распечаток.
Как я могу в этом разобраться?
Обновление:
я добавил цикл для запуска перед основным циклом:
int kkk = 1214
int c = 0;
while (c < foosBoxes[x][y][z].end()){
aFoo = foosBoxes[x][y][z][c++];
printf("%i\t, kkk);
fflush(stdout);
}
Что дает те же результаты.
Обновление:
согласно GDB:
Программа получила сигнал SIGSEGV, Ошибка сегментации. 0x000000000043e400 в повороте (kkk = 1214) в /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/tr1/boost_shared_ptr. h: 153 153 dispose ();
Я думаю, что подходящей функцией в boost_shared_ptr.h является
void
release() // nothrow
{
if (__gnu_cxx::__exchange_and_add(&_M_use_count, -1) == 1)
{
dispose(); //this is line 153
#ifdef __GTHREADS
_GLIBCXX_READ_MEM_BARRIER;
_GLIBCXX_WRITE_MEM_BARRIER;
#endif
if (__gnu_cxx::__exchange_and_add(&_M_weak_count, -1) == 1)
destroy();
}
}
dispose()
определяется в другом месте файла:
// dispose() is called when _M_use_count drops to zero, to release
// the resources managed by *this.
virtual void
dispose() = 0; // nothrow
Может быть, причина в плохом управлении shared_ptr, и я должен вернуться к обычному указателю?
Обновление:
еще один тест с аналогичным результатом:
int kkk = 1214 int c = fooBoxes [x] [y] [z] .size (); в то время как (c> = 0) {aFoo = foosBoxes [x] [y] [z] [c--]; printf ("% i \ t, kkk); fflush (stdout);}
На этот раз программа вылетает на третьей итерации. Если проблема заключалась в неправильном распределении, тогда программа должна была дать сбой на первой итерации (в обратном направлении программа выйдет из строя на первой итерации).