информационная безопасность
без паники и всерьез
 подробно о проекте
Портрет посетителяСтрашный баг в WindowsАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Хакеры начали эксплуатировать критическую... 
 Критическая уязвимость UEFI позволяет... 
 Японский хостинг попросил клиентов... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] проблемы с STL 26.07.01 14:54  Число просмотров: 960
Автор: XR <eXtremal Research> Статус: The Elderman
<"чистая" ссылка>
> спасибо за ответ. Мне все это конечно известно.
>
> Я придумал несколько другой способ.
>

По идее перезгузка destroy() это примерно то же самое.

>
> А мне интересно, разве в стандартной библиотеке нет такого
> встроенного механизма.

Нет и быть не должно ... указатель это только указатель,
убив его в одном списке ты можешь иметь его в 33 других
и мало ли где еще ...
<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 других
и мало ли где еще ...
1





Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach