Каковы возможные причины сигнала 11 при вызове деструктора?

У меня есть следующий цикл (это происходит, когда массив из 24 объектов типа SgApp удаляется с помощью delete [])

   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>

В этом коде% ebx действует как итератор% esi, указывающий на начало массива, и sizeof (SgApp) = 0xd4. В начале массива первые 4 байта представляют число 24.
Линия 0x086f5371 <+61>: call DWORD PTR [eax] вызывает SgApp по умолчанию виртуальный деструктор.

  1. Из этого кода я понимаю, что первый DWORD объекта указывает на vtable, а первый DWORD от vtable указывает на деструктор. Это правильно? Это происходит каждый раз, когда у меня есть виртуальный деструктор?

  2. При каких условиях этот вызов деструктора вызовет ошибку сигнала 11 сегмента именно на этой линии 0x086f5371 <+61>: call DWORD PTR [eax]? Я предполагаю, что значение, указанное% eax, находится в какой-то нераспределенной зоне, но каковы возможные причины этого? На данный момент у меня должно быть все 24 объекта типа SgApp (они были созданы в конструкторе).

Я упоминаю, что этот сигнал 11 произошел только один раз, и все, что я получил, это паршивый дамп памяти. В нормальных условиях это невозможно воспроизвести, поэтому я ищу все возможные объяснения, включая, возможно, какую-то аппаратную ошибку или какой-то экзотический сценарий.

0

Решение

Я предполагаю, что вы не следуете правило трех и вы получите два или более объекта, указывающих на один и тот же динамически распределенный массив. Когда вызывается их деструктор, второй вызов приводит к попытке delete [] то, что уже было delete[]редактор

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector