Использование std::auto_ptr в стандартных контейнерах
От: Greh  
Дата: 25.10.03 21:49
Оценка:
На днях столкнулся с одной интересной проблемой.
Понадобилось мне создать массив smart указателей. Не спрашивайте зачем.
Не долго думая, пишу следующий код —

[...]

class temp
{
};

typedef std::auto_ptr<temp> temp_ptr;
typedef typename std::deque<temp_ptr> temp_deque;

void main()
{
temp_ptr p(new temp);
temp_deque deq;
deq.push_back(p);
}

[...]

При компиляции ошибка, причем на строчку в недрах STL.
Начинаю разбираться. Не секрет, что при добавлении объекта, deque (как впрочем и остальные стандартные контейнеры) пользуются его копирующим коструктором. А конструктор, как изветно, принимает в качестве своего единственного параметра ссылку на константный копируемый объект. Но, (как я мог об этом забыть!) копирующий коструктор std::auto_ptr коренным образом отличается от своего _обычного_ собрата. Приставочки const у принимаемого объекта-то и нет. Не надо объяснять для чего это делалось разработчиками, и делалось конечно правильно, иначе как у копируемого объкта отобрать права владения указателем. Но вот мне — то как быть в этом случае?
По моему, даже если бы в std::auto_ptr кто-нибудь добрый добавил в конструкторе приставку const, а внутри применил преобразование типов — например const_cast, даже это не спасло бы отца русской демократии. Ведь ни кто не гарантирует что в STL не создадут (для каких нибудь профилактических целей) временный объект. И тогда права, отойдут в его безвременное, но к ложалению краткое пользование. С соответствующими последствиями.
Или, что вероятнее, пользователь такого deque (например я) может забыть с чем имеет дело и получить копию объекта из массива.
Вот и захотелось мне поинтересоваться у всезнающего ALL. Как быть бедному мне в этом случае и как работать с подобными классами в стандартных контейнерах (имеются ввиду классы копии которых владеют одним ресурсом).
Re: Использование std::auto_ptr в стандартных контейнерах
От: Аноним  
Дата: 25.10.03 23:12
Оценка:
Здравствуйте, Greh, Вы писали:

G>На днях столкнулся с одной интересной проблемой.


Это не проблема, это особенности реализации std::auto_ptr.
Про это уже довольно много говорили тут. Можешь поискать.
В общем не надо использовать auto_ptr со стандартными контейнерами.
Причина именно в том, что auto_ptr реализует только одного владельца.
shared_ptr из boost будет тебе в самый раз
Re[2]: Использование std::auto_ptr в стандартных контейнерах
От: Greh  
Дата: 26.10.03 04:29
Оценка:
Здравствуйте, Аноним, Вы писали:

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


G>>На днях столкнулся с одной интересной проблемой.


А>Это не проблема, это особенности реализации std::auto_ptr.

А>Про это уже довольно много говорили тут. Можешь поискать.
А>В общем не надо использовать auto_ptr со стандартными контейнерами.
А>Причина именно в том, что auto_ptr реализует только одного владельца.
А>shared_ptr из boost будет тебе в самый раз

^^^^^^^^^
ок, спасибо, я так и понял.
Вот только что за boost такой? Я тут недавно, могу чего-то не знать.
Re[3]: Использование std::auto_ptr в стандартных контейнерах
От: ArtDenis Россия  
Дата: 26.10.03 05:58
Оценка:
Здравствуйте, Greh, Вы писали:
G>Вот только что за boost такой? Я тут недавно, могу чего-то не знать.

http://www.boost.org/
... << RSDN@Home 1.1 beta 1 >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Использование std::auto_ptr в стандартных контейнерах
От: retalik www.airbandits.com/
Дата: 26.10.03 06:01
Оценка: :)
Здравствуйте, Greh, Вы писали:

G>Не долго думая, пишу следующий код -


G>[...]

G>typedef std::auto_ptr<temp> temp_ptr;
G>typedef typename std::deque<temp_ptr> temp_deque;
G>[...]
Мне это все напоминает "Как сварить яйцо в микроволновке" Леонида Каганова:

Q: Сколько времени надо варить куриное яйцо в микроволновке? Микроволновка "Bosh".
A: Яйца нельзя варить в микроволновке потому что они взрываются. Используйте кастрюлю и обычную плиту.

Q: Как надо обработать яйцо чтобы сварить его в микроволновке?
A: Не существует способа сварить яйцо в микроволновке.

Q: Как именно происходит взрыв яйца с точки зрения науки и почему?
A: Яйцо резко теряет целостность и приобретает форму стенок печки. Это происходит из-за нагревания в печах микроволнового типа. Кулинарная наука запрещает это делать.

Q: Я налила в стеклянную кастрюлю воды чтобы уравнять осмотическое давление, положила два яйца, накрыла тарелкой и поставила в печку. Вода еще не закипела, а яйца уже взорвались и разбили тарелку!
A: Вы забыли посолить воду. Кастрюля должна быть металлической, печка — обычная, не микроволнового типа.

Q: Я сварил яйцо отдельно вкрутую, а затем поставил разогреть на 20 секунд. Оно взорвалось. В чем моя ошибка?
A: Не следовало разогревать яйцо. Вы могли съесть его холодным или разогреть, опустив в горячую воду на 2-5 минут.

Q: Как при помощи микроволновки познакомиться с мужчиной? Мне 27 лет, рыба.
A: Не следует готовить яйца в микроволновке, сходите на вечеринку или дискотеку.

Ну и т.д., в том же духе на http://lleo.aha.ru/arhive/esse/ej/mikrowave.shtml.

Ну нельзя хранить std::auto_ptr в стандартных контейнерах!
А насчет буста — дык http://boost.org/. Берешь оттуда boost::shared_ptr и хранишь себе на здоровье.
Успехов,
Виталий.
Re[2]: Использование std::auto_ptr в стандартных контейнерах
От: Аноним  
Дата: 26.10.03 08:19
Оценка:
Здравствуйте, retalik, Вы писали:

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


G>>Не долго думая, пишу следующий код -


G>>[...]

G>>typedef std::auto_ptr<temp> temp_ptr;
G>>typedef typename std::deque<temp_ptr> temp_deque;
G>>[...]
R>Мне это все напоминает "Как сварить яйцо в микроволновке" Леонида Каганова:
R>Ну нельзя хранить std::auto_ptr в стандартных контейнерах!
^^^^^
Спасибо тебе, добрый человек на добром же слове, понял я это уже, давно понял, если ты внимательно читал мою мессагу. Но все равно спасибо, за совет, за мудрость твою, за поучение меня, дурака этакого....

А насчет буста — дык http://boost.org/. Берешь оттуда boost::shared_ptr и хранишь себе на здоровье.
^^^
А вот теперь действительно спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.