I이 코드 % EBX에 다음 루프 (이 유형 SgApp 24 객체의 어레이가 삭제 []로 삭제 될 때 일어난다)소멸자 호출시 신호 11에 대한 가능한 이유는 무엇입니까?
0x086f5361 <+45>: cmp ebx,DWORD PTR [esi+0x4]
0x086f5364 <+48>: je 0x86f5375 <PSM::~PSM()+65>
0x086f5366 <+50>: sub ebx,0xd4
0x086f536c <+56>: mov eax,DWORD PTR [ebx]
0x086f536e <+58>: mov DWORD PTR [esp],ebx
=> 0x086f5371 <+61>: call DWORD PTR [eax]
0x086f5373 <+63>: jmp 0x86f5361 <PSM::~PSM()+45>
는의 시작 반복자 %의 ESI 포인트 같이 행동 한 배열 및 sizeof (SgApp) = 0xd4. 배열의 시작 부분에서 처음 4 바이트는 숫자 24를 나타냅니다. 라인 0x086f5371 <+61>: call DWORD PTR [eax]
은 SgApp 기본 가상 소멸자를 호출합니다. 이 코드에서
- 내가 이해하는 vtable을하고 소멸자에 VTABLE 점에서 첫 번째 DWORD에 물체 점의 첫 번째 DWORD. 이 올바른지? 가상 소멸자가있을 때마다 이런 일이 발생합니까?
어떤 조건에서 소멸자를 호출하면이 정확한 줄에 신호 11 세그 폴트가 발생합니다
0x086f5371 <+61>: call DWORD PTR [eax]
? 내 생각 엔 % eax가 가리키는 값이 할당되지 않은 영역에 있지만이 이유는 무엇입니까? 이 시점에서 나는 SgApp 타입의 24 개의 객체를 모두 가지고 있어야한다 (그들은 생성자에서 생성되었다).
나는이 신호 11이 한 번만 발생했으며 내가 얻은 것은 코어 덤프라는 것을 언급했다. 정상적인 상황에서는 이것이 재현 할 수 없기 때문에 일부 하드웨어 결함이나 일부 이국적인 시나리오를 포함하여 가능한 모든 설명을 찾고 있습니다.
대신 실제 C++ 코드를 표시 할 수 없습니까? –
@JoachimPileborg 불행히도 나는 기본적으로 PSM 생성자에서'keys = new SgApp [24];를 가질 수없고 PSM 소멸자에서'delete [] keys; '를 가진다. 또한 값으로 전달 된 PSM 오브젝트도 없습니다. – George
실제로 존재하지 않는 객체를 삭제하는 것이므로 'this'가 null이거나 소멸자의 다른 잘못된 포인터 일 가능성이 있습니다. –