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