Здравствуйте, _chipset, Вы писали:
_>Здравствуйте, Аноним, Вы писали:
А>>Добрый день,
А>>Реализованы ли смарт поинтеры в STL'е? _>Что то типа этого.. auto_ptr
его же вроде не рекомендуется использовать
даже запрещено комитетом по стандартизации
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _chipset, Вы писали:
_>>Здравствуйте, Аноним, Вы писали:
А>>>Добрый день,
А>>>Реализованы ли смарт поинтеры в STL'е? _>>Что то типа этого.. auto_ptr
А>его же вроде не рекомендуется использовать А>даже запрещено комитетом по стандартизации
его запрещено использовать в контейнерах, так как он не copy-constructible.
и только.
в остальных случаях — вперед, отличная и быстрая вещь.
You will always get what you always got
If you always do what you always did
Re[4]: умный указатель
От:
Аноним
Дата:
07.12.04 00:55
Оценка:
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, _chipset, Вы писали:
_>>>Здравствуйте, Аноним, Вы писали:
А>>>>Добрый день,
А>>>>Реализованы ли смарт поинтеры в STL'е? _>>>Что то типа этого.. auto_ptr
А>>его же вроде не рекомендуется использовать А>>даже запрещено комитетом по стандартизации
J>его запрещено использовать в контейнерах, так как он не copy-constructible. J>и только.
J>в остальных случаях — вперед, отличная и быстрая вещь.
В "эффективном использовании STL" Скота Мейрса
как раз говориться что про контейнеры да еще приводиться код который показывает непригодность auto_ptr в целом
auto_ptr<Widget> pw1(new Widget);
auto_ptr<Widget> pw2(pw1);
pw1 = pw2;
// копирование указателя auto_ptr приводит к его модификации
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, _chipset, Вы писали:
_>>>Здравствуйте, Аноним, Вы писали:
А>>>>Добрый день,
А>>>>Реализованы ли смарт поинтеры в STL'е? _>>>Что то типа этого.. auto_ptr
А>>его же вроде не рекомендуется использовать А>>даже запрещено комитетом по стандартизации
J>его запрещено использовать в контейнерах, так как он не copy-constructible. J>и только.
J>в остальных случаях — вперед, отличная и быстрая вещь.
он что и delete сделает за меня?
то есть что то типа сборки мусора?
Здравствуйте, Аноним, Вы писали:
А>Добрый день,
А>Реализованы ли смарт поинтеры в STL'е?
Смарт поинтер в srl-е не реализован. Реализован авто-поинтер (auto_ptr). Разница между ними в следующем:
— смарт поинтер при копировании использует какой-нибудь механизм контроля числа владельцев реального указателя (точнее числа копий самого указателя); это обычно либо подсчёт ссылок, либо двунаправленый список копий; удаление указателя происходит когда его отпускает последний владелец (счётчик ссылок доходит до 0, список пустеет);
— авто-поинтер при копировании передаёт все права на хранимый указатель копии, при уничтожении авто-поинтера всегда уничтожатеся и указатель; по этим причинам комитетом по стандартизации запрещено использование авто-поинтера в стандартных контейнерах (некоторые операции с контейнерами могут приводить к копированию элементов, что может повлечь за собой разрушение реальных указателей), "правильные" реализации stl не допускают такое использование (при попытке вылетает ошибка компиляции), реализация используемая в студии вопреки требований стандарта такое использование допускает.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Аноним, Вы писали:
А>Добрый день,
А>Реализованы ли смарт поинтеры в STL'е?
как уже сказали auto_ptr.
хорошая вещь если уметь пользоваться. здесь можно кое что почитать про auto_ptr.
В статье, Герб Саттер приводит пример реализации идиомы Pimpl с помощью auto_ptr,
ты так не делай, почему,читай здесь
А>В "эффективном использовании STL" Скота Мейрса А>как раз говориться что про контейнеры да еще приводиться код который показывает непригодность auto_ptr в целом
Ну-ну-ну... В целом это ты загнул. В контейнерах как уже сказали — да, нельзя использовать (ну или нежелательно), а так пользуй на здоровье. А ваще его например очень активно пользует Саттер в примерах в "Решении сложных задач на С++". Полистай, там много интересных вещей есть.
Здравствуйте, Аноним, Вы писали:
А>>>>>Реализованы ли смарт поинтеры в STL'е? _>>>>Что то типа этого.. auto_ptr
А>>>его же вроде не рекомендуется использовать А>>>даже запрещено комитетом по стандартизации
J>>его запрещено использовать в контейнерах, так как он не copy-constructible. J>>и только. J>>в остальных случаях — вперед, отличная и быстрая вещь. А>В "эффективном использовании STL" Скота Мейрса А>как раз говориться что про контейнеры да еще приводиться код который показывает непригодность auto_ptr в целом А>
А>auto_ptr<Widget> pw1(new Widget);
А>auto_ptr<Widget> pw2(pw1);
А>pw1 = pw2;
А>// копирование указателя auto_ptr приводит к его модификации
А>
Почитай те у Герба Саттера "Решение сложных задач на С++" — он там много времени посвящает этому указателю, разбирая. когда его можно и нужно использовать, а когда нельзя и опасно...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Mr. None, Вы писали:
MN>Здравствуйте, Аноним, Вы писали:
А>>Добрый день,
А>>Реализованы ли смарт поинтеры в STL'е?
MN>Смарт поинтер в srl-е не реализован. Реализован авто-поинтер (auto_ptr). Разница между ними в следующем: MN>- смарт поинтер при копировании использует какой-нибудь механизм контроля числа владельцев реального указателя (точнее числа копий самого указателя); это обычно либо подсчёт ссылок, либо двунаправленый список копий; удаление указателя происходит когда его отпускает последний владелец (счётчик ссылок доходит до 0, список пустеет); MN>- авто-поинтер при копировании передаёт все права на хранимый указатель копии, при уничтожении авто-поинтера всегда уничтожатеся и указатель; по этим причинам комитетом по стандартизации запрещено использование авто-поинтера в стандартных контейнерах (некоторые операции с контейнерами могут приводить к копированию элементов, что может повлечь за собой разрушение реальных указателей), "правильные" реализации stl не допускают такое использование (при попытке вылетает ошибка компиляции), реализация используемая в студии вопреки требований стандарта такое использование допускает.
Не, и то и другое — это разные виды умного указателя. они отличаются стратегией владения объекта. Об этом хорошонаписал Александреску в своей книжке "Современное проектирование на С++". Рецензия — на сайте...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Аноним, Вы писали:
А>его же вроде не рекомендуется использовать А>даже запрещено комитетом по стандартизации
Я так понимаю, автор неверно трактовал слова Скотта Мейерса из его книги Effective STL:
Containers of auto_ptr (COAPs) are prohibited. Code attempting to use them shouldn't compile. The C++
Standardization Committee expended untold effort to arrange for that to be the case.
Effective STL, Item 8 — Never create containers of auto_ptrs.
далее как раз приводится пример с передачей прав владения при копировании auto_ptr-ов. Но, как уже было сказано, это фича auto_ptr-ов. В STL других умных указателей нет. Гораздо более богатый выбор смарт поинтеров предалагает boost: shared_ptr, scoped_ptr, intrusive_ptr, weak_ptr, shared_array и scoped_array. Посмотреть примеры использования можно здесь
Здравствуйте, MaximE, Вы писали:
ME>Mr. None wrote:
>> Смарт поинтер в srl-е не реализован. Реализован авто-поинтер (auto_ptr). Разница между ними в следующем:
ME>Smart pointer — это то, что не plain pointer, и auto_ptr<> — это smart-pointer.
похоже, мы наблюдаем исчезновение термина Smart pointer и употребление его в качестве разговорного названия boost::smart_ptr
Hello, jazzer!
You wrote on Tue, 07 Dec 2004 13:52:00 GMT:
j> Здравствуйте, MaximE, Вы писали:
ME>> Mr. None wrote:
??>>> Смарт поинтер в srl-е не реализован. Реализован авто-поинтер
??>>> (auto_ptr). Разница между ними в следующем:
ME>> Smart pointer — это то, что не plain pointer, и auto_ptr<> — это ME>> smart-pointer.
j> похоже, мы наблюдаем исчезновение термина Smart pointer и употребление j> его в качестве разговорного названия boost::smart_ptr
А что за boost::smart_ptr? boost::shared_prt знаю, boost::scoped_ptr знаю, а
вот boost::smart_ptr встречать как-то не доводилось...
With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Читал-читал про stв::auto_ptr, про boost... Всё кажется каким-то слижком уж тяжеловесным для моей задачи. Оцените, плиз, мою задумку — подскажите, кто какие грабли в ней видит!
(впрочем, раньше я с "умными указателями" не работал — может, мне мозги кто вправит — а?)
Задача:
Неопределённое количество объектов (B, C, D) хранит в себе указатели на объект A.
Так получается (у русских обычно так :) ), что никто (ни объект А, ни кто-либо ещё) не понмит, где и сколько указателей на объект A существует. Наступает момент, когда объект А деструктируется, а кто-то обращается к нему по якобы валидному указателю (при обращении выполняется проверка, в лучшем случае, на !NULL) - и усё...
Требуется принять какие-либо меры к тому, чтобы "обезопасить код".
Главный критерий - минимальный расход памяти
(каждый байт на счету - дело в том, что программа ворочает тьмущей тьмой данных и неосторожное добавление полей в классы повышает расход RAM на десятки и сотни мегабайт...) -
это останавливает меня в использовании выше упомянутых ауто-смарт-птэров...
Моё предложение:
При каждом объекте, на который возможны ссылки (в примере выше - объекте A) "держать" ещё одну ячейку памяти (назовём её PA) с указателем на A. Все остальные объекты (B, C, D) имеют у себя не указатель непосредственно на A, а указатель на PA (то есть, работают по двойному указателю A**). "Хозяин" объекта A, уничтожая его, обнуляет PA - и таким образом все ссылки, сколько бьы их ни было, становятся явно невалидными.
On Tue, 11 Oct 2005 10:42:15 +0400, isek <31527@users.rsdn.ru> wrote:
> Читал-читал про stв::auto_ptr, про boost... Всё кажется каким-то слижком уж тяжеловесным для моей задачи. Оцените, плиз, мою задумку — подскажите, кто какие грабли в ней видит!
[]
прочитай про boost::intrusive_ptr<>. Менее тяжеловесное решение для твоей задачи придумать сложно.