Можно ли имея указатель на произвольный класс (зная о классе только то, что у него есть виртуальный деструктор), получить указатель на этот деструтор и вызвать его?
Я предположил, что указатель на вирт. деструктор располагается в vTable где-то в определённом месте. К тому же деструеторы не имеют параметров. Значит можно реализовать такую функцию:
void DeleteObject(void* object_pointer)
{
call_destructor(object_pointer); // ХЗ как это сделать
free(object_pointer);
}
Это было бы очень полезно в случае класса CUnknown:
вместо
Здравствуйте, Chez, Вы писали:
C>Можно ли имея указатель на произвольный класс (зная о классе только то, что у него есть виртуальный деструктор), получить указатель на этот деструтор и вызвать его?
Нет:
12.4/2
...
The address of a destructor shall not be taken.
...
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Chez, Вы писали:
C>>Можно ли имея указатель на произвольный класс (зная о классе только то, что у него есть виртуальный деструктор), получить указатель на этот деструтор и вызвать его?
B>Нет: B>
B>12.4/2
B>...
B>The address of a destructor shall not be taken.
B>...
B>
Тут написано shall... Т.е. это можно, но не нужно.
Он то всё-таки есть, этот адрес!
Будет удалять всегда все объекты из памяти вызывая правильно свои деструкторы, несмотря на количество наследований, количество CDestructor-ов... количество предков... ???
Здравствуйте, Chez, Вы писали:
C>Можно ли имея указатель на произвольный класс (зная о классе только то, что у него есть виртуальный деструктор), получить указатель на этот деструтор и вызвать его?
А тип указателя не известен?
То есть можно было бы конечно написать нечто вроде
Правда с временныи объектами такой код породит полный писец. Кроме того, если есть только указатель void* я че-то слабо представляю как по нему можно определить адрес чего бы то ни было.
C>Я предположил, что указатель на вирт. деструктор располагается в vTable где-то в определённом месте. К тому же деструеторы не имеют параметров. Значит можно реализовать такую функцию: C>
void DeleteObject(void* object_pointer)
C>{
C> call_destructor(object_pointer); // ХЗ как это сделать
C> free(object_pointer);
C>}
C>Это было бы очень полезно в случае класса CUnknown: C>вместо
Chez:
> C>>Можно ли имея указатель на произвольный класс (зная о классе только то, что у него есть виртуальный деструктор), получить указатель на этот деструтор и вызвать его?
> B>Нет: 12.4/2 ... The address of a destructor shall not be taken.
> Тут написано shall... Т.е. это можно, но не нужно.
В стандарте "shall not" означает "нельзя", а т.к. реализации обычно выдают диагностику на использование подобных конструкций, то на практике — "невозможно".
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
C>Можно ли имея указатель на произвольный класс (зная о классе только то, что у него есть виртуальный деструктор), получить указатель на этот деструтор и вызвать его?
C>Я предположил, что указатель на вирт. деструктор располагается в vTable где-то в определённом месте. К тому же деструеторы не имеют параметров. Значит можно реализовать такую функцию: C>
void DeleteObject(void* object_pointer)
C>{
C> call_destructor(object_pointer); // ХЗ как это сделать
C> free(object_pointer);
C>}
C>Это было бы очень полезно в случае класса CUnknown: C>вместо
Поскольку классу CUnknown требуется только УДАЛЕНИЕ объекта по указателю pObj
Можно унаследовать классы всех объектов используемых с CUnknown от обшего класса с пустым виртуальным деструктором. И преобразовывать не в void* a в указатель на этот класс и т.д. Переносимо, единственное размер обектов увеличится на размер указателя.