У меня есть следующий цикл (это происходит, когда массив из 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 по умолчанию виртуальный деструктор.
Из этого кода я понимаю, что первый DWORD объекта указывает на vtable, а первый DWORD от vtable указывает на деструктор. Это правильно? Это происходит каждый раз, когда у меня есть виртуальный деструктор?
При каких условиях этот вызов деструктора вызовет ошибку сигнала 11 сегмента именно на этой линии 0x086f5371 <+61>: call DWORD PTR [eax]
? Я предполагаю, что значение, указанное% eax, находится в какой-то нераспределенной зоне, но каковы возможные причины этого? На данный момент у меня должно быть все 24 объекта типа SgApp (они были созданы в конструкторе).
Я упоминаю, что этот сигнал 11 произошел только один раз, и все, что я получил, это паршивый дамп памяти. В нормальных условиях это невозможно воспроизвести, поэтому я ищу все возможные объяснения, включая, возможно, какую-то аппаратную ошибку или какой-то экзотический сценарий.
Я предполагаю, что вы не следуете правило трех и вы получите два или более объекта, указывающих на один и тот же динамически распределенный массив. Когда вызывается их деструктор, второй вызов приводит к попытке delete []
то, что уже было delete[]
редактор
Других решений пока нет …