LPVOID и вызов деструктора
От: aveSatanas  
Дата: 22.06.07 13:18
Оценка:
Доброе время суток.

Пример:
SomeClass * pClass = new SomeClass();
LPVOID lpVoid = pClass;
delete lpVoid;

В этом случае деструктор класса не вызывается (деструктор виртуальный).
Как можно сделать чтобы при удалении LPVOID вызывался деструктор класса?
Re: LPVOID и вызов деструктора
От: Bell Россия  
Дата: 22.06.07 13:24
Оценка: +1
Здравствуйте, 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.

Любите книгу — источник знаний (с) М.Горький
Re: LPVOID и вызов деструктора
От: shnyaps  
Дата: 22.06.07 13:31
Оценка:
Здравствуйте, aveSatanas, Вы писали:

S>Доброе время суток.


S>Пример:

S>SomeClass * pClass = new SomeClass();
S>LPVOID lpVoid = pClass;
S>delete lpVoid;

S>В этом случае деструктор класса не вызывается (деструктор виртуальный).

S>Как можно сделать чтобы при удалении LPVOID вызывался деструктор класса?

а такой вариант подходит:

template<typename T>
void release(T* obj) {
delete obj;
}

class SomeClass {
int a;
public:
SomeClass() {};
~SomeClass() {};
};

int main(void)
{
SomeClass* pClass = new SomeClass();
release(pClass);
return 0;
}
Re[2]: LPVOID и вызов деструктора
От: aveSatanas  
Дата: 22.06.07 13:48
Оценка:
Здравствуйте, 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 для хранения значения в самописном листе.
Придется сделать типизированный лист на основе шаблонов.
Re[3]: LPVOID и вызов деструктора
От: NikeByNike Россия  
Дата: 22.06.07 14:03
Оценка: +1
Здравствуйте, aveSatanas, Вы писали:

S>Да я думаю подходит. Я использую LPVOID для хранения значения в самописном листе.

S>Придется сделать типизированный лист на основе шаблонов.

А чем тебя stl не устраивает? Судя по всему нужно его использовать.
Нужно разобрать угил.
Re[3]: LPVOID и вызов деструктора
От: Erop Россия  
Дата: 22.06.07 14:05
Оценка:
Здравствуйте, aveSatanas, Вы писали:

S>Да я думаю подходит. Я использую LPVOID для хранения значения в самописном листе.

S>Придется сделать типизированный лист на основе шаблонов.

Можно сделать и так:
Завести
struct CDeleteble {
    virtual ~CDeleteble() {}
};


Ну и все твои классы, которые ты хочешь удалять таким способом, виртуально выводить из CDeleteble, ну а вместо LPVOID использовать CDeleteble*.

Тогда, по идее, всё должно получиться...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: LPVOID и вызов деструктора
От: shnyaps  
Дата: 22.06.07 14:07
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, aveSatanas, Вы писали:


S>>Да я думаю подходит. Я использую LPVOID для хранения значения в самописном листе.

S>>Придется сделать типизированный лист на основе шаблонов.

E>Можно сделать и так:

E>Завести
struct CDeleteble {
E>    virtual ~CDeleteble() {}
E>};


E>Ну и все твои классы, которые ты хочешь удалять таким способом, виртуально выводить из CDeleteble, ну а вместо LPVOID использовать CDeleteble*.


E>Тогда, по идее, всё должно получиться...


тоже вариант. но по традиции нужно его CObject обозвать
Re[4]: LPVOID и вызов деструктора
От: NikeByNike Россия  
Дата: 22.06.07 14:08
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Можно сделать и так:

E>Завести
struct CDeleteble {
E>    virtual ~CDeleteble() {}
E>};


E>Ну и все твои классы, которые ты хочешь удалять таким способом, виртуально выводить из CDeleteble, ну а вместо LPVOID использовать CDeleteble*.


E>Тогда, по идее, всё должно получиться...


Чему ты человека учишь У него заведемо неверный подход, а ты ему костыли предлагаешь
Нужно разобрать угил.
Re[5]: LPVOID и вызов деструктора
От: Erop Россия  
Дата: 22.06.07 14:12
Оценка:
Здравствуйте, shnyaps, Вы писали:

S>тоже вариант. но по традиции нужно его CObject обозвать

Ну, по традиции, CObject немного другой
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: LPVOID и вызов деструктора
От: Кодт Россия  
Дата: 22.06.07 14:37
Оценка:
Здравствуйте, 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*-ы, ты всегда можешь привести их к этой структуре.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.