Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
[Win32] проблемы с STL 26.07.01 12:23 Число просмотров: 874
Автор: XR <eXtremal Research> Статус: The Elderman
|
> class A > { > public: > A(){ a = new char[100];} > ~A(){ delete a;} > }; > > void main() > { > std::list<A*> l; > A* a = new A(); > l.push_back(a); > l.clear(); > } > > Почему не вызывается деструктор объекта а при очистке > списка?
А почему он должен вызываться ?
Откуда ему знать ЧТО ты желаешь сделать с этими указателями ?
В данном случае clear() уничтожает УКАЗАТЕЛИ на объекты а не сами объекты...
> Если хранить в списке не указатели, а объекты, то все > нормально. > Но нужны именно указатели.
унаследовать свой класс списка от std::list<...>
и перегрузить std::list<...>.clear()
в котором организовать уничтожение твоих объектов через указатели
PS: ты же всегда можешь посмотреть как то или иное действие определено в STL ...
вот и смотри...
|
|
<programming>
|
[Win32] проблемы с STL 26.07.01 11:48
Автор: waka Статус: Незарегистрированный пользователь
|
class A
{
public:
A(){ a = new char[100];}
~A(){ delete a;}
};
void main()
{
std::list<A*> l;
A* a = new A();
l.push_back(a);
l.clear();
}
Почему не вызывается деструктор объекта а при очистке списка?
Если хранить в списке не указатели, а объекты, то все нормально.
Но нужны именно указатели.
|
 |
[Win32] проблемы с STL 26.07.01 12:23
Автор: XR <eXtremal Research> Статус: The Elderman
|
> class A > { > public: > A(){ a = new char[100];} > ~A(){ delete a;} > }; > > void main() > { > std::list<A*> l; > A* a = new A(); > l.push_back(a); > l.clear(); > } > > Почему не вызывается деструктор объекта а при очистке > списка?
А почему он должен вызываться ?
Откуда ему знать ЧТО ты желаешь сделать с этими указателями ?
В данном случае clear() уничтожает УКАЗАТЕЛИ на объекты а не сами объекты...
> Если хранить в списке не указатели, а объекты, то все > нормально. > Но нужны именно указатели.
унаследовать свой класс списка от std::list<...>
и перегрузить std::list<...>.clear()
в котором организовать уничтожение твоих объектов через указатели
PS: ты же всегда можешь посмотреть как то или иное действие определено в STL ...
вот и смотри...
|
 |  |
[Win32] проблемы с STL 26.07.01 13:59
Автор: waka Статус: Незарегистрированный пользователь
|
спасибо за ответ. Мне все это конечно известно.
Я придумал несколько другой способ.
template<class T>
class allocatorMy : public std::allocator<T>
{
public :
// Перегружаем destroy
void destroy(pointer _P)
{
_Destroy(*_P); // перед удалением указателя удаляем сам объект
_Destroy(_P);
}
};
А список надо использовать так:
class A{ .... }
void main()
{
std::list<A*, allocatorMy<A*>> l;
A* a = new A();
l.push_back(a);
}
А мне интересно, разве в стандартной библиотеке нет такого встроенного механизма.
|
 |  |  |
[Win32] проблемы с STL 26.07.01 14:54
Автор: XR <eXtremal Research> Статус: The Elderman
|
> спасибо за ответ. Мне все это конечно известно. > > Я придумал несколько другой способ. >
По идее перезгузка destroy() это примерно то же самое.
> > А мне интересно, разве в стандартной библиотеке нет такого > встроенного механизма.
Нет и быть не должно ... указатель это только указатель,
убив его в одном списке ты можешь иметь его в 33 других
и мало ли где еще ...
|
|
|