auto_ptr и контейнеры
От: Аноним  
Дата: 22.01.03 11:23
Оценка:
Не могли бы вы привести маленький примерчик, хорошо иллюстрирующий проблемы применения auto_ptr в STL контейнерах?
Спасибо.
Re: auto_ptr и контейнеры
От: Lexey Россия  
Дата: 22.01.03 11:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не могли бы вы привести маленький примерчик, хорошо иллюстрирующий проблемы применения auto_ptr в STL контейнерах?


auto_ptr нельзя применять в контейнерах. Используй boost::shared_ptr или напиши свой аналог.
Re[2]: auto_ptr и контейнеры
От: Аноним  
Дата: 22.01.03 11:29
Оценка:
Здравствуйте, Lexey, Вы писали:

А>>Не могли бы вы привести маленький примерчик, хорошо иллюстрирующий проблемы применения auto_ptr в STL контейнерах?


L>auto_ptr нельзя применять в контейнерах. Используй boost::shared_ptr или напиши свой аналог.


Ну вот я и хочу узнать почему нельзя... Примерчик с проблемкой можешь написать?
Re[3]: auto_ptr и контейнеры
От: Lexey Россия  
Дата: 22.01.03 11:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну вот я и хочу узнать почему нельзя... Примерчик с проблемкой можешь написать?


Да просто потому, что не предназначен он для этого. Разделяемый указатель должен считать ссылки. auto_ptr ссылки не считает.
Re: auto_ptr и контейнеры
От: Кодт Россия  
Дата: 22.01.03 11:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не могли бы вы привести маленький примерчик, хорошо иллюстрирующий проблемы применения auto_ptr в STL контейнерах?


Проблема — в том, что auto_ptr единолично владеет объектом, на который указывает.
Поэтому при копировании/присваивании получается, что несколько auto_ptr'ов указывают (и, следовательно, монопольно владеют) одним объектом.
Когда auto_ptr освобождается (в деструкторе или при изменении), он уничтожает объект. Все остальные указатели получают дохлую ссылку.
Перекуём баги на фичи!
Re[3]: auto_ptr и контейнеры
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 22.01.03 11:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну вот я и хочу узнать почему нельзя...


например при сортировке вектора алгоритмом sort может быть такое — опорный элемент копируется во временную переменную, в нем остается NULL, а временная переменная уничтожается при выходе из области видимости. После сортировки имеем часть элементов вектора == NULL.

А>Примерчик с проблемкой можешь написать?


попробуй сам
Re: auto_ptr и контейнеры
От: Павел Кузнецов  
Дата: 22.01.03 11:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не могли бы вы привести маленький примерчик, хорошо иллюстрирующий проблемы применения auto_ptr в STL контейнерах?


#include <vector>
#include <memory>

int main()
{
  std::vector<std::auto_ptr<int> > v;
  v.push_back(std::auto_ptr<int>(new int(10)));
}


Данный пример не должен компилироваться соответствующим стандарту компилятором.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: auto_ptr и контейнеры
От: m.a.g. Мальта http://dottedmag.net/
Дата: 22.01.03 11:40
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Ну вот я и хочу узнать почему нельзя... Примерчик с проблемкой можешь написать?


Согласно стандарту vector<auto_ptr<хоть что> > не должен даже компилироваться. А проблема в том, что STL полагается на то, что члены контейнеров реализуют присваивание без побочных эффектов.
... << Vanessa Mae [] Contradanza >> ...
Re[2]: auto_ptr и контейнеры
От: UgN  
Дата: 22.01.03 11:41
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Проблема — в том, что auto_ptr единолично владеет объектом, на который указывает.


А зачем там флажок bool _Owns ?

К>Поэтому при копировании/присваивании получается, что несколько auto_ptr'ов указывают (и, следовательно, монопольно владеют) одним объектом.


Они флажок переключают и объектом всегда только один владеет.

К>Когда auto_ptr освобождается (в деструкторе или при изменении), он уничтожает объект. Все остальные указатели получают дохлую ссылку.


Не получат (если auto_ptr'ы)
Re[3]: auto_ptr и контейнеры
От: Lexey Россия  
Дата: 22.01.03 11:46
Оценка:
Здравствуйте, UgN, Вы писали:

К>>Проблема — в том, что auto_ptr единолично владеет объектом, на который указывает.


UgN>А зачем там флажок bool _Owns ?


Он используется при copy-конструировании auto_ptr, чтобы при передаче auto_ptr внуть функции он не порушил объект на выходе из нее.

К>>Поэтому при копировании/присваивании получается, что несколько auto_ptr'ов указывают (и, следовательно, монопольно владеют) одним объектом.


UgN>Они флажок переключают и объектом всегда только один владеет.


Это ничем не спасает в случае с stl-контейнерами, т.к. там после копирования разрушается не копия, а исходный указатель, который является оунером, и спокойно рушит объект.
Re[2]: auto_ptr и контейнеры
От: Аноним  
Дата: 22.01.03 11:48
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>
ПК>#include <vector>
ПК>#include <memory>

ПК>int main()
ПК>{
ПК>  std::vector<std::auto_ptr<int> > v;
ПК>  v.push_back(std::auto_ptr<int>(new int(10)));
ПК>}
ПК>


ПК>Данный пример не должен компилироваться соответствующим стандарту компилятором.


А если будет обернут, то откомпилируется. (Если в вектор положить класс производный от auto_ptr)
Правильно ли я понимаю, что основная проблема, как указал m.a.g., в том, что

STL полагается на то, что члены контейнеров реализуют присваивание без побочных эффектов

?
Re[3]: auto_ptr и контейнеры
От: Павел Кузнецов  
Дата: 22.01.03 11:55
Оценка:
Здравствуйте, Аноним, Вы писали:

ПК>>Данный пример не должен компилироваться соответствующим стандарту компилятором.


А>А если будет обернут, то откомпилируется. (Если в вектор положить класс производный от auto_ptr)


Интересно, как будет реализован копирующий конструктор этого класса, уж не с const_cast? Необходимость подобных танцев с бубном не наводит на размышления? Если ты все же добъешься того, что модифицированный пример будет компилироваться, попробуй добавить в контейнер несколько элементов и отсортировать его...

А>Правильно ли я понимаю, что основная проблема, как указал m.a.g., в том, что STL полагается на то, что члены контейнеров реализуют присваивание без побочных эффектов?


Формально, элементы стандартных контейнеров должны быть CopyConstructible и Assignable. std::auto_ptr не удовлетворяет этим требованиям.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: auto_ptr и контейнеры
От: Дмитрий Наумов  
Дата: 22.01.03 12:51
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


А>>Не могли бы вы привести маленький примерчик, хорошо иллюстрирующий проблемы применения auto_ptr в STL контейнерах?


К>Проблема — в том, что auto_ptr единолично владеет объектом, на который указывает.

К>Поэтому при копировании/присваивании получается, что несколько auto_ptr'ов указывают (и, следовательно, монопольно владеют) одним объектом.
К>Когда auto_ptr освобождается (в деструкторе или при изменении), он уничтожает объект. Все остальные указатели получают дохлую ссылку.

Все это враки! Владеет только один, поэтому в конструкторе копирования для auto_ptr, параметер, переданный в конструктор, на самом деле модифицируется. Его указатель на "владеемый" элемент обнуляется.
... << RSDN@Home 1.0 beta 5 >>
Re[3]: auto_ptr и контейнеры
От: Андрей Тарасевич Беларусь  
Дата: 22.01.03 18:05
Оценка:
Здравствуйте, UgN, Вы писали:

UgN>Здравствуйте, Кодт, Вы писали:


К>>Проблема — в том, что auto_ptr единолично владеет объектом, на который указывает.


UgN>А зачем там флажок bool _Owns ?


Нет там никакого флажка. Флажок ты увидел в реализации STL идущей с MSVC++ 6. Эта реализация 'auto_ptr' давно устарела и имеет мало общего с настоящей реализацией 'auto_ptr'. В правильной релизации 'auto_ptr' никакого флажка не нужно.
Best regards,
Андрей Тарасевич
Re[3]: auto_ptr и контейнеры
От: Андрей Тарасевич Беларусь  
Дата: 22.01.03 18:11
Оценка:
Здравствуйте, Аноним, Вы писали:

L>>auto_ptr нельзя применять в контейнерах. Используй boost::shared_ptr или напиши свой аналог.


А>Ну вот я и хочу узнать почему нельзя... Примерчик с проблемкой можешь написать?


Не нужен никако примерчик. Спецификация языка просто напросто открытым текстом запрещает исрользование 'std::auto_ptr' в контейнерах. На основании того, что 'std::auto_ptr' не удовлетворяет стандартным требованиям к элементу контейнера (CopyConstructible и Assignable). Да и не скомпилируется код просто напросто (см. пример в сообщении Павла Кузнецова).

С 'auto_ptr' из комплекта MSVC++ 6 это код скомпилируется. Но этот 'auto_ptr' к настоящему 'std::auto_ptr' почти никакого отношения не имеет.
Best regards,
Андрей Тарасевич
Re[4]: auto_ptr и контейнеры
От: MaximE Великобритания  
Дата: 22.01.03 20:45
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

UgN>>А зачем там флажок bool _Owns ?


АТ>Нет там никакого флажка. Флажок ты увидел в реализации STL идущей с MSVC++ 6. Эта реализация 'auto_ptr' давно устарела и имеет мало общего с настоящей реализацией 'auto_ptr'. В правильной релизации 'auto_ptr' никакого флажка не нужно.


Я был просто шокирован, когда не обнаружил у auto_ptr из STL от MSVC++ 6 метода reset().
Re[5]: auto_ptr и контейнеры
От: dad  
Дата: 07.04.04 12:43
Оценка:
АТ>>Нет там никакого флажка. Флажок ты увидел в реализации STL идущей с MSVC++ 6. Эта реализация 'auto_ptr' давно устарела и имеет мало общего с настоящей реализацией 'auto_ptr'. В правильной релизации 'auto_ptr' никакого флажка не нужно.

ME>Я был просто шокирован, когда не обнаружил у auto_ptr из STL от MSVC++ 6 метода reset().


появилась необходимость откомпилировать на 6ой студии со стандартной либо и тоже очумел
должно же бить какое то обновление?
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re: auto_ptr и контейнеры
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 07.04.04 12:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не могли бы вы привести маленький примерчик, хорошо иллюстрирующий проблемы применения auto_ptr в STL контейнерах?

А>Спасибо.

std::vector<std::auto_ptr<int> > myVec;
// Здесь что-то вставляем в контейнер
std::sort(myVec.begin(), myVec.end(), some_pred);
// some_pred - некий предикат сравнения для std::auto_ptr<int>


Если скомпилируется, то после выполнения этого кода часть данных в контейнере может быть уничтожена.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[2]: auto_ptr и контейнеры
От: jazzer Россия Skype: enerjazzer
Дата: 07.04.04 13:41
Оценка:
Здравствуйте, Lexey, Вы писали:

L>Здравствуйте, Аноним, Вы писали:


А>>Не могли бы вы привести маленький примерчик, хорошо иллюстрирующий проблемы применения auto_ptr в STL контейнерах?


L>auto_ptr нельзя применять в контейнерах. Используй boost::shared_ptr или напиши свой аналог.


Никогда не варите яйцо в микроволновке :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: auto_ptr и контейнеры
От: MaximE Великобритания  
Дата: 07.04.04 13:44
Оценка:
Здравствуйте, dad, Вы писали:

АТ>>>Нет там никакого флажка. Флажок ты увидел в реализации STL идущей с MSVC++ 6. Эта реализация 'auto_ptr' давно устарела и имеет мало общего с настоящей реализацией 'auto_ptr'. В правильной релизации 'auto_ptr' никакого флажка не нужно.


ME>>Я был просто шокирован, когда не обнаружил у auto_ptr из STL от MSVC++ 6 метода reset().


dad>появилась необходимость откомпилировать на 6ой студии со стандартной либо и тоже очумел

dad>должно же бить какое то обновление?

Да — STLPort
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.