Я пытаюсь экспортировать класс из DLL. Я читал эту статью на этом: http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLLКак обрабатывать деструкторы в экспортированных DLL-интерфейсах
«зрелый» подход предполагает, что используется абстрактный класс, так что у меня есть:
// Header
class IFoo{
public:
virtual int getBar() = 0;
}
class Foo: public IFoo {...}
DLLEXPORT IFoo* Create();
DLLEXPRT void Free(IFoo* inst);
//DLL cpp
IFoo* Create(){ return new Foo; }
void Free(IFoo* inst){ delete inst; }
озадачивает меня: Если я не виртуальные destructor, то delete inst
не будет вызывать деструктор Foos и может протечь память. Как я должен справиться с этим? Статья не дает ответа на это.
Использование virtual ~IFoo(){}
не представляется возможным, поскольку это добавляет реализация к IFoo, который вызывает проблемы (объяснение в ответ на вопрос, в статье для виртуальной функции инлайн) и virtual ~IFoo() = 0;
завершается с ошибкой линкера на неопределенный символ ~IFoo
Что такое безопасный способ? Как должны быть реализованы функции Free/Release?
Не делать вещи более сложными, чем они нуждаются быть. Просто предоставьте виртуальный деструктор в 'IFoo' и экспортируйте его определение. –
Вместо этого вы можете добавить виртуальную функцию Free(). Кастинг * inst * to Foo * - это еще один способ, а не лучше. –
@HansPassant: Почему бы не просто виртуальный деструктор? –