Здравствуйте, aveSatanas, Вы писали:
S>Доброе время суток.
S>Пример: S>SomeClass * pClass = new SomeClass(); S>LPVOID lpVoid = pClass; S>delete lpVoid;
S>В этом случае деструктор класса не вызывается (деструктор виртуальный). S>Как можно сделать чтобы при удалении LPVOID вызывался деструктор класса?
Никак. Нет информации о типе — неизвестно чей деструктор звать.
И вообще это неопределенное поведение:
5.3.5/3
In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the
static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual
destructor or the behavior is undefined.
Здравствуйте, aveSatanas, Вы писали:
S>Доброе время суток.
S>Пример: S>SomeClass * pClass = new SomeClass(); S>LPVOID lpVoid = pClass; S>delete lpVoid;
S>В этом случае деструктор класса не вызывается (деструктор виртуальный). S>Как можно сделать чтобы при удалении LPVOID вызывался деструктор класса?
Здравствуйте, shnyaps, Вы писали:
S>Здравствуйте, aveSatanas, Вы писали:
S>>Доброе время суток.
S>>Пример: S>>SomeClass * pClass = new SomeClass(); S>>LPVOID lpVoid = pClass; S>>delete lpVoid;
S>>В этом случае деструктор класса не вызывается (деструктор виртуальный). S>>Как можно сделать чтобы при удалении LPVOID вызывался деструктор класса?
S>а такой вариант подходит:
S>template<typename T> S>void release(T* obj) { S> delete obj; S>}
S>class SomeClass { S> int a; S>public: S> SomeClass() {}; S> ~SomeClass() {}; S>};
S>int main(void) S>{ S> SomeClass* pClass = new SomeClass(); S> release(pClass); S> return 0; S>}
Да я думаю подходит. Я использую LPVOID для хранения значения в самописном листе.
Придется сделать типизированный лист на основе шаблонов.
Здравствуйте, aveSatanas, Вы писали:
S>Да я думаю подходит. Я использую LPVOID для хранения значения в самописном листе. S>Придется сделать типизированный лист на основе шаблонов.
А чем тебя stl не устраивает? Судя по всему нужно его использовать.
Здравствуйте, aveSatanas, Вы писали:
S>Да я думаю подходит. Я использую LPVOID для хранения значения в самописном листе. S>Придется сделать типизированный лист на основе шаблонов.
Можно сделать и так:
Завести
struct CDeleteble {
virtual ~CDeleteble() {}
};
Ну и все твои классы, которые ты хочешь удалять таким способом, виртуально выводить из CDeleteble, ну а вместо LPVOID использовать CDeleteble*.
Тогда, по идее, всё должно получиться...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, aveSatanas, Вы писали:
S>>Да я думаю подходит. Я использую LPVOID для хранения значения в самописном листе. S>>Придется сделать типизированный лист на основе шаблонов.
E>Можно сделать и так: E>Завести
E>Ну и все твои классы, которые ты хочешь удалять таким способом, виртуально выводить из CDeleteble, ну а вместо LPVOID использовать CDeleteble*.
E>Тогда, по идее, всё должно получиться...
тоже вариант. но по традиции нужно его CObject обозвать
E>Ну и все твои классы, которые ты хочешь удалять таким способом, виртуально выводить из CDeleteble, ну а вместо LPVOID использовать CDeleteble*.
E>Тогда, по идее, всё должно получиться...
Чему ты человека учишь У него заведемо неверный подход, а ты ему костыли предлагаешь
Здравствуйте, shnyaps, Вы писали:
S>тоже вариант. но по традиции нужно его CObject обозвать
Ну, по традиции, CObject немного другой
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, aveSatanas, Вы писали:
S>Как можно сделать чтобы при удалении LPVOID вызывался деструктор класса?
Если тебе нужно полностью отстроиться от типа, можешь хранить void* на объект и void(*)(void*) на функцию-разрушитель.
namespace boost
{
template<class T>
void checked_delete(void* p)
{
delete (T*)p;
}
};
void* p = new Foo();
void(*)(void*) d = boost::checked_delete<Foo>;
.....
d(p);
Естественно, что d и p нужно держать вместе. Например, в структуре заранее известного типа — std::pair, boost::shared_ptr, и т.п.
Даже если твой список хранит void*-ы, ты всегда можешь привести их к этой структуре.