Добрый день!
Вы писали:
Представим себе, что плагин собран компилятором A, а основная программа, использующая его – компилятором B. Если мы загружаем класс из плагина, его экземпляр создаётся кодом, сгенерированным компилятором A. И если мы попытаемся удалить этот экземпляр из кода основной программы просто вызвав деструктор, то удалить его попытается код, сгенерированный компиляторов B. ... Чтобы избежать подобных проблем, деструктор ~DynamicClass() сделан защищённым, а вместо него следует вызывать метод DynamicClass::Destroy(). Это метод гарантирует, что память выделяется и освобождается из одной и той же кучи.
При этом
сlass DynamicClass
{
public:
void Destroy() throw() { delete this; }
...
protected:
virtual ~DynamicClass() throw() {;; }
};
Но ведь реализация такого метода
Destroy() будет в коде основной программы, оттуда он вызывается и вызов
delete будет происходит тоже из нее, то есть как если бы мы прямо использовали
delete plugin в коде основной программы.
Мне кажется должно быть так:
сlass DynamicClass
{
public:
virtual void Destroy() = 0;
...
};
сlass MyPlugin : public DynamicClass
{
public:
virtual void Destroy() { delete this; }
...
};
Если я не прав, то поясните подробнее пожалуйста.