2013-02-18 2 views
0

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 기본 가상 소멸자를 호출합니다. 이 코드에서

  1. 내가 이해하는 vtable을하고 소멸자에 VTABLE 점에서 첫 번째 DWORD에 물체 점의 첫 번째 DWORD. 이 올바른지? 가상 소멸자가있을 때마다 이런 일이 발생합니까?

  2. 어떤 조건에서 소멸자를 호출하면이 정확한 줄에 신호 11 세그 폴트가 발생합니다 0x086f5371 <+61>: call DWORD PTR [eax]? 내 생각 엔 % eax가 가리키는 값이 할당되지 않은 영역에 있지만이 이유는 무엇입니까? 이 시점에서 나는 SgApp 타입의 24 개의 객체를 모두 가지고 있어야한다 (그들은 생성자에서 생성되었다).

나는이 신호 11이 한 번만 발생했으며 내가 얻은 것은 코어 덤프라는 것을 언급했다. 정상적인 상황에서는 이것이 재현 할 수 없기 때문에 일부 하드웨어 결함이나 일부 이국적인 시나리오를 포함하여 가능한 모든 설명을 찾고 있습니다.

+1

대신 실제 C++ 코드를 표시 할 수 없습니까? –

+0

@JoachimPileborg 불행히도 나는 기본적으로 PSM 생성자에서'keys = new SgApp [24];를 가질 수없고 PSM 소멸자에서'delete [] keys; '를 가진다. 또한 값으로 전달 된 PSM 오브젝트도 없습니다. – George

+0

실제로 존재하지 않는 객체를 삭제하는 것이므로 'this'가 null이거나 소멸자의 다른 잘못된 포인터 일 가능성이 있습니다. –

답변

2

나는 당신이 rule of three을 따르지 않고, 같은 동적으로 할당 된 배열을 가리키는 두 개 이상의 객체로 끝날 것이라고 추측합니다. 소멸자가 호출되면 두 번째 호출은 이미 delete[] ed가 된 delete []에 시도합니다.

+0

사실 복사 생성자와 대입 연산자가 구현되지 않았습니다 (이것은 내 설계가 아닙니다. 코드에서 모든 매개 변수는 값으로 전달되지 않고 포인터 만 전달됩니다). 그러나 이는 원인이 아닙니다. 'keys '가 처음 4 바이트 전에 지워지려면 24를 나타내지 않을 것이지만 -1은 gcc 컴파일러를 사용합니다. 편집 : 코어 덤프 및 배열의 ​​처음 4 바이트를 포함하여 일부 값을 인쇄 할 수 있습니다. – George