ในรหัสของฉัน ฉันมี vector <vector <vector <vector <std::tr1::shared_ptr<foo> > > > >
ชื่อ foosBoxes
เวกเตอร์ที่ซ้อนกันมีบทบาทในการจำลองตำแหน่งฟิสิคัลบ็อกซ์ ฉันยังมี while loop ซึ่งทำให้เกิดข้อผิดพลาดในการแบ่งส่วน:
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 กำจัด();
ฉันคิดว่าฟังก์ชั่นที่เหมาะสมใน 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); }
คราวนี้โปรแกรมสนใจในการวนซ้ำครั้งที่สาม หากปัญหาเกิดจากการจัดสรรที่ไม่ถูกต้อง โปรแกรมควรมีการทับซ้อนในการวนซ้ำครั้งแรก (ในทิศทางตรงกันข้าม โปรแกรมจะขัดข้องในการวนซ้ำครั้งแรก)