Dalam kode saya, saya memiliki vector <vector <vector <vector <std::tr1::shared_ptr<foo> > > > >
bernama foosBoxes
. Vektor bersarang mempunyai peran mensimulasikan posisi kotak fisik. Saya juga memiliki loop sementara yang menyebabkan kesalahan segmentasi:
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;
}
Beberapa hal yang telah saya coba:
1. Saya telah mencoba menggunakan aFoo = *fooit++
tetapi tidak berhasil.
2. Kesalahan segmentasi terjadi kira-kira setelah beberapa perseribu putaran yang berjalan dengan baik.
3. Saya telah mencoba mencoba mengatasi masalah valgrind dan valgrind menyelesaikan langkah tersebut.
4. Dalam loop yang macet, saya telah mencetak penghitung yang berjalan sebelum dan sesudah baris yang dicurigai. ketika sebelum garis, saya mendapatkan 8 cetakan (ukuran vektor) dan ketika setelahnya saya mendapatkan 7 cetakan.
Bagaimana saya bisa mengetahui hal ini?
Pembaruan:
Saya telah menambahkan loop untuk dijalankan sebelum loop utama:
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);
}
Yang menghasilkan hasil yang sama.
Pembaruan:
menurut gdb:
Program menerima sinyal SIGSEGV, kesalahan segmentasi. 0x000000000043e400 diputar (kkk=1214) di /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/tr1/boost_shared_ptr. h:153 153 buang();
Saya pikir fungsi yang sesuai di boost_shared_ptr.h adalah
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()
didefinisikan di tempat lain dalam file:
// dispose() is called when _M_use_count drops to zero, to release
// the resources managed by *this.
virtual void
dispose() = 0; // nothrow
Mungkinkah alasannya adalah pengelolaan shared_ptr yang buruk dan saya harus beralih kembali ke penunjuk biasa?
Pembaruan:
tes lain dengan hasil serupa:
int kkk = 1214 int c = fooBoxes[x][y][z].size(); sementara (c >= 0){ aFoo = foosBoxes[x][y][z][c--]; printf("%i\t, kkk); fflush(stdout); }
Kali ini program crush pada iterasi ketiga. Jika masalahnya ada pada alokasi yang salah, maka program tersebut seharusnya mengalami crash pada iterasi pertama (berlawanan dengan arah program crash pada iterasi pertama).