Виртуальный деструктор
От: 3m-soft  
Дата: 05.03.13 08:18
Оценка:
Здравствуйте. Открыл для себя неожиданный неприятный момент и обращаюсь сюда в надежде разобраться.

Есть класс реализованный и экспортированный из mylib.dll. В классе есть виртуальный деструктор. Задумывается что объекты этого класса могут создаваться где угодно, а после использования будут возвращаться в mylib.dll для утилизации. В силу некоторых причин утилизация не быстрое дело, и ей занимается отдельный поток в mylib.dll, который ожидает завершения некоторых операций после чего уничтожает его (delete).

Есть модуль dynaload.dll. Он создает объект (new) этого класса, а в конце жизни поступает с ним по описанному выше сценарию. Здесь я столкнулся с проблемой. Модуль dynaload.dll динамически выгружаемый модуль и выгружается он быстрее чем mylib.dll вызывает delete и тогда я получаю EXCEPTION_ACCESS_VIOLATION.

Оказалось, что при создании объекта на стороне dynaload.dll меняется vtable на другую, фактически на свой деструктор, который прежде чем вызвать оригинальный занимается чем-то (не силен в ассемблере) и потом вызывает оригинальный, реализованный в mylib.dll. Поэтому когда dynaload.dll выгружается установленный деструктор сваливает вместе с модулем. Отсюда и EXCEPTION_ACCESS_VIOLATION.

Конечно проблема решаемая: делаю экспортированную функцию в mylib.dll, в которой создается объект и дело в шляпе, ведь так сохраняется оригинальная vtable. Но хочу понять зачем компилятор VS2012 меняет vtable и как это отключить и какую работу выполняет эта обертка вокруг деструктора.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.