Вот моя проблема. Я делаю C++ dll, который широко использует экспорт объектов экземпляра. Итак, я возвращаю свои фактические экземпляры в качестве указателей для интерфейса через какой-либо экспортированный заводский метод.Чистый виртуальный деструктор в интерфейсе
Интерфейсы, которые я использую, являются чисто виртуальными, чтобы избежать связывания пробления. Так что мне нужен чистый виртуальный деструктор тоже, и я реализовал один (с пустым телом, как я его разобрал). Все компилируется отлично, за исключением ... Я не вижу, если вызываются фактические деструкторы или нет, потому что когда я добавил
std::cout << "hello destructor";, я никогда не увижу его.
У меня есть явное «удаление obj» (EDIT: и он вызван из метода «FreeObject» внутри dll), это не проблема.
Я что-то не хватает? Есть ли другой способ удалить мой объект через интерфейс?
EDIT: Опять же, у меня нет несоответствия в управлении памятью, это все внутри dll. Но правый деструктор просто не начинается.
Уже позаботился об этом. Я отредактировал мой вопрос, чтобы быть ясным. – ALOR
Я по-прежнему рекомендую использовать шаблон COM AddRef/Release. 'FreeObject' звучит как ужасно общее имя, как определяется параметр? Убранный указатель должен иметь тип времени компиляции, по крайней мере такой же конкретный, как базовый класс, который объявляет виртуальный деструктор для того, чтобы произошло виртуальное удаление - 'delete (void *) p' никогда не вызовет любого деструктора на' p' , –
Использование нового/удаления через dll bun dries было проблемой 10 лет назад, когда среда исполнения была доступна только как статическая библиотека. Эта проблема была решена с введением общей версии lib для dll runtime (что означает, что для всего приложения имеется одна куча). Если вы не «вручную» загружаете/выгружаете dll, использование нового/удаления через dll bun dries больше не является проблемой. –