Вот как я решил вашу конкретную проблему для динамически загружаемых классов C ++ -
Иметь базовый класс для всех подключаемых объектов, т. Е.
class object_t {
public:
virtual ~object_t();
//other type utils...
};
Иметь базовый интерфейс для всех интерфейсов плагиновто есть
class object_t;
class interface_t {
public:
virtual object_t* object() = 0;
}
object_t будет иметь связь, определите ее в своей собственной dll, которую вы будете связывать с классами плагинов.Другими полезными хуками, которые должны быть в object_t, являются копирование, порождение, RTTI и другие утилиты типов, например, у моего базового объекта есть spawn (), copy (), object_name ().
Так что все конкретные классы происходят от object_t иих соответствующий чистый тип виртуального интерфейса и все опубликованные (подключаемые) интерфейсы являются производными от interface_t.
Затем вы можете загрузить плагин, создать экземпляр интерфейса, используя вашу фабрику, и таким образом удалить -
delete interface->object()
А так как object_t имеет виртуальный деструктор, будет вызван правильный деструктор.
Нет проблем с тем, где вы удаляете объект под linux, хорошо под окном, если все плагины / исполняемые файлы связаны с одним и тем же динамическим (dll) CRT.