|
|
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Ребята, просветите что лучше использовать auto_ptr или new + delete. или в принципе разницы никакой нет, просто при использовании auto_ptr ненужно заботится о том чтоб не забыть сделать delete обьекту ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 13:13 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
auto_ptr'ом надо уметь пользоваться, иначе потом будет много отрицательных эмоций. Лучше взять что-нибудь из boost. Хотя ежели разницы нет то проект небольшой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 13:36 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Главное - это уяснить, что голые new + detele поценциально опасны. А далее уже надо выбирать среди std::auto_ptr, boost::share_ptr и т.п. по тому, какая стратегия владения вам необходима. std::auto_ptr при копировании всегда передает право владения копии, boost::shared_ptr хранит указатель до тех пор, пока существует хотя бы одна ссылка на него. Вы можете показать как вы будете использовать эти объекты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 14:00 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков пишет: > Главное - это уяснить, что голые new + detele поценциально опасны. А .... при наличии исключений . Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 14:03 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Даже если бы в С++ не было исключений, никто не исключает возможность банально забыть освободить память (memory leak), присвоить указателю новое значение (memory leak). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 14:05 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
.... при наличии исключений . ... return тоже неплохо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 14:06 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
... как и любой выход из влока, break к примеру в цикле ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 14:08 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
суммарно: - любой из smart_ptr представляет реализацию более общей идиомы RAII для управления ресурсом памяти (очень важно при работе с исключениями, и не только) - реализация std::auto_ptr призвана обеспечить минимальный (м.б. нулевым) overhead по сравнению с обычными указателями, но платой за это является отсутствие полноценной семантики копирования (очень важно для работы с контейнерами, так же передача параметров по значению) отсюда область применения -- локальные блоки, иначе альтернатива boost::shared_ptr (или еще чего) - если вас интересует случай new[], то тут используются std::vector, boost::shared_array (или еще чего), но не auto_ptr /* поправьте если чего не так */ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 15:02 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир пишет: Рибяты йа нидумал о таких прастых вищах. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 15:59 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковДаже если бы в С++ не было исключений, никто не исключает возможность банально забыть освободить память (memory leak), присвоить указателю новое значение (memory leak). это лечится новыми руками от ушей. опять же зависит от кривизны рук. если сразу ничего не удаляете, то никогда ничто вам не поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 16:07 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Да-да, вы с детства программируете без утечек памяти и пользовались всю жизнь только голыми указателями ;) Skope guard-ы решают перечисленные здесь проблемы и позволяют получить ясность в вопросах связанные с временем жизни динамических объектов. Вы, я так понял, ратуете за выпремление рук - как вы собираетесь достич этой цели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 16:39 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Рибяты йа нидумал о таких прастых вищах. панемайу! но для аффтора топега возможна фсе не так проста.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 18:25 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Да-да, вы с детства программируете без утечек памяти и пользовались всю жизнь только голыми указателями ;) да, было время в детстве на plain C лабали ;) а некоторые на нем и до сих пор рисуют и ничего ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 18:28 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков... и пользовались всю жизнь только голыми указателями ;) только её половину..., потом на ссылки перешел.. ;) sashka304 Ребята, просветите что лучше использовать auto_ptr или new + delete. Для какой задачи? Если в классе один раз выделяется блок памяти, висит там без изменений, и убивается в деструкторе, зачем там auto_ptr? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 18:30 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
ErV Анатолий Широков... и пользовались всю жизнь только голыми указателями ;) только её половину..., потом на ссылки перешел.. ;) sashka304 Ребята, просветите что лучше использовать auto_ptr или new + delete. Для какой задачи? Если в классе один раз выделяется блок памяти, висит там без изменений, и убивается в деструкторе, зачем там auto_ptr? А потом их становится два, и ежели 2-ой не выделился нужно вернуть первый. И так без конца один и тотже спор. Что лучше быть богатым тормозом или бедным шустряком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 18:46 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
лучще быть богатым тормозом :)) вообщем у меня пока выделение памяти под объект происходит в одном классе, раньше часть кода была написана с new и delete, а мне вот надо немного дописать и переписать, вот я думаю использовать auto_ptr или делать как там и было... обьектиков в разных ф-ях создается от 1 до 10. Почитав посты думаю всетаки сделаю я auto_ptr :) спасибо, ребята, большое!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 19:06 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковДа-да, вы с детства программируете без утечек памяти и пользовались всю жизнь только голыми указателями ;) Skope guard-ы решают перечисленные здесь проблемы и позволяют получить ясность в вопросах связанные с временем жизни динамических объектов. Вы, я так понял, ратуете за выпремление рук - как вы собираетесь достич этой цели? я за нормальный код. на самом деле руки тут и ни при чем. и я знаю (работаю) с проектом в 100к строк. и там сделано все нормально. любая динамика повешена на SOFT_FREE или SOFT_DELETE. это - простые дефайны, облегчившие и решившие большинство задач. для прочей прстоты используются СОБСТВЕННЫЕ манагеры, т.к. они и быстрее и понятней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 21:18 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
blinded А потом их становится два, и ежели 2-ой не выделился нужно вернуть первый. И так без конца один и тотже спор. Что лучше быть богатым тормозом или бедным шустряком. Если я точно знаю, где и как обьект будет использоваться, то можно и без auto_ptr обойтись. Тем более, как я понял, для конструкции типа SomeClass** (динамически выделяется массив указателей, для указателей создяются обьекты, потом указатели сортируются) это не вариант. Спорить не буду - не вижу смысла. (так как выльется в очередной холивар типа "исключения - за и против" и "кто-нибудь обьяснит мне чем Дельфи лучше C++") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2007, 03:14 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
ErV : Если в классе один раз выделяется блок памяти, висит там без изменений, и убивается в деструкторе, зачем там auto_ptr? однакож, если в конструкторе выделяется память а потом происходит неперехваченное исключение, то до деструктора дело просто не доходит == memory leak об этом тоже стоит помнить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2007, 11:45 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир ErV : Если в классе один раз выделяется блок памяти, висит там без изменений, и убивается в деструкторе, зачем там auto_ptr? однакож, если в конструкторе выделяется память а потом происходит неперехваченное исключение, то до деструктора дело просто не доходит == memory leak об этом тоже стоит помнить Насколько я помню, если класс (в котором выделяется блок памяти) используется в программе как SomeClass someclass; //а не SomeClass* someclass; произойдет раскрутка стека, и будет вызван деструктор. При исключении в конструкторе, если оно не было обработано, работа программы завершается, а системные ресурсы, используемые процессом, под Win, если я не ошибаюсь, освобождаются по факту его завершения. Можете проверить: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2007, 13:18 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Память не высвобождается, но система в нокаут не уходит. WinXP, по крайней мере... исчо раз: при неперехваченном исключении в конструкторе, объект не считается созданным и его деструктор не вызывается если дело происходит внутри сервиса (дЭмона), то скорей всего исключение перехватывается на более высоком уровне и пишется в лог, работа продолжается, утечка накапливается и через некоторое время сервер "станет раком" "и это очень плохо" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2007, 13:51 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир Память не высвобождается, но система в нокаут не уходит. WinXP, по крайней мере... исчо раз: при неперехваченном исключении в конструкторе, объект не считается созданным и его деструктор не вызывается если дело происходит внутри сервиса (дЭмона), то скорей всего исключение перехватывается на более высоком уровне и пишется в лог, работа продолжается, утечка накапливается и через некоторое время сервер "станет раком" "и это очень плохо" 1) и что, прям auto_ptr это решает? не верю. 2) в том числе и поэтому я за нормальный код (т.е. без корявых исключений). все гораздо проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2007, 20:04 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin1) и что, прям auto_ptr это решает? не верю. 2) в том числе и поэтому я за нормальный код (т.е. без корявых исключений). 1)Представь себе да решает 2)А за тебя все уже решили, оператор new это делает почем зря C++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2007, 21:12 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
blinded Aklin1) и что, прям auto_ptr это решает? не верю. 2) в том числе и поэтому я за нормальный код (т.е. без корявых исключений). 1)Представь себе да решает 2)А за тебя все уже решили, оператор new это делает почем зря 1) все равно не верю 1.1) если и решает, то коряво 1.1.1) а ты не думал, зачем программисту дали такую свободу? чтобы он сам все нормально делал. 2) new - не есть нормальный код ? самый что ни есть нормальный а вот исключения как уже говорилось - плохо. [quote] C++[/quote] не совсем согласен, ибо не я работю на си, а он на меня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2007, 16:04 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
1) все равно не верю 1.1) если и решает, то коряво вариант 1: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. вариант 2: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. впрочем есть еще альтернатива try/catch 2) new - не есть нормальный код ? самый что ни есть нормальный а вот исключения как уже говорилось - плохо. тут дело в том, что исключения это часть современного C++ - поэтому, либо вы контролируете весь свой код, включая библиотеки - либо plain old C - либо миритесь с тем, что new A() может высвать исключение "такие дела" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2007, 16:25 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
1) Наш мир не совершенен и auto_ptr тоже. Наппример с масивами он не работает. Однако же это средство стандартное, а по мне армейский принцип: хоть безобразно, зато единообразно. приобретает вса большую актуальность. 2) Должен разочаровать, в вашем понимании new ненормален. Он позволяет себе при нехватке памяти генерировать bad_alloc. Так что присоединяйтесь C++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2007, 16:48 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
а по мне армейский принцип: хоть безобразно, зато единообразно. хехе. а кто меня извращенцем обзывал ? ;) new позволяет себе при нехватке памяти генерировать bad_alloc более того, еще возможны исключения в конструкторах создаваемых объектов впрочем для POD и простых классов этого можно легко избежать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2007, 17:24 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
обоим: 1) чей-то я не особо понял ,чего такого мне пытались показать 2) new рулит. 3) исключения - штука хорошая с закрытых помещениях, т.е. не ломающая логику программы 3.1) даже с исключениями есть SAFE_DELETE который вполне сносно используется при исключениях. 3.1.1) а еще есть манагеры собственные.... 3.1.....1) короче не просто не убедили, но и укрепили. аффтопитезь: объект либо именован, либо не существует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2007, 17:31 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin 1) чей-то я не особо понял ,чего такого мне пытались показать Пытались показать что использование RAII значительно упрощает жизнь Aklin 2) new рулит. Совсем не по-детски и в неожиданном для вас направлении. Ну не желаете вы пользоваться исключениями, а он это делает, даже в тех случаях когда вы уверены что это не такю Удинственный способ его "исправить" ключик у компилятора включить:) Aklin 3) исключения - штука хорошая с закрытых помещениях, т.е. не ломающая логику программы Вы не любите кошек? Да вы просто не умеете их готовить!:) Мы по этому поводу отношения выяснили здесь Aklin 3.1) даже с исключениями есть SAFE_DELETE который вполне сносно используется при исключениях. 3.1.1) а еще есть манагеры собственные.... Ты бы показал нам темным как надо. Просвяти, покажи! А то вот живем и не знаем как надо. Ну а мы потрепем, может родим такое что вуликие гуру будут опыт перенимать. Aklin 3.1.....1) короче не просто не убедили, но и укрепили. Укрепеился в вере? Земля плоская и на 3 слонах? Ну ладно, я не настаиваю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2007, 19:00 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
blinded Пытались показать что использование RAII значительно упрощает жизнь не убедили. blinded Совсем не по-детски и в неожиданном для вас направлении. Ну не желаете вы пользоваться исключениями, а он это делает, даже в тех случаях когда вы уверены что это не такю Удинственный способ его "исправить" ключик у компилятора включить:) я говорил, что использование исключений только в закрытых пространствах. blinded Вы не любите кошек? Да вы просто не умеете их готовить!:) Мы по этому поводу отношения выяснили здесь читал, читал и отвечал. результатом стало то, что исключения кривые и работа с ними плоха. кроме этого есть статик, глобал и много прочих полезных штук. я за исключения только в исключтельных случаях(с) и в закрытых простанствах. blinded Ты бы показал нам темным как надо. Просвяти, покажи! А то вот живем и не знаем как надо. Ну а мы потрепем, может родим такое что вуликие гуру будут опыт перенимать. Код: plaintext 1. 2. 3. blinded Укрепеился в вере? Земля плоская и на 3 слонах? Ну ладно, я не настаиваю. в том что исключения кривые а дополнительные настрйки неповоротливы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 10:25 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
а ну да, есть еще одноа прикольная конструкция приглушающая ваши доводы. Код: plaintext 1. 2. 3. аффтопитезь: объект либо именован, либо не существует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 10:27 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin blinded Пытались показать что использование RAII значительно упрощает жизнь не убедили. Значит плохие убеждальщики. Но мы будем продолжать Aklin blinded Совсем не по-детски и в неожиданном для вас направлении. Ну не желаете вы пользоваться исключениями, а он это делает, даже в тех случаях когда вы уверены что это не такю Удинственный способ его "исправить" ключик у компилятора включить:) я говорил, что использование исключений только в закрытых пространствах. А как быть с new? Но об этом ниже. Aklin blinded Вы не любите кошек? Да вы просто не умеете их готовить!:) Мы по этому поводу отношения выяснили здесь читал, читал и отвечал. результатом стало то, что исключения кривые и работа с ними плоха. кроме этого есть статик, глобал и много прочих полезных штук. я за исключения только в исключтельных случаях(с) и в закрытых простанствах. Ну это вы сделали такой вывод Aklin blinded Ты бы показал нам темным как надо. Просвяти, покажи! А то вот живем и не знаем как надо. Ну а мы потрепем, может родим такое что вуликие гуру будут опыт перенимать. Код: plaintext 1. 2. 3. Уж не так ли он выглядит Код: plaintext 1. 2. 3. 4. 5. 6. 1) Начнем с просто Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 3) А вот теперь предствавим что руки у меня кривые и сунул я в SAFE_DELETE что-то совсеи не то Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. А теперь объясни мне зачем весь это геморрой, если есть легкие классы оберток, которые все это закрывают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 11:30 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
blindedДолжен разочаровать, в вашем понимании new ненормален. Он позволяет себе при нехватке памяти генерировать bad_alloc. Так что присоединяйтесь Обьясните, пожлауйста, каким образом auto_ptr может помочь при нехватке памяти. blindedА теперь объясни мне зачем весь это геморрой, если есть легкие классы оберток, которые все это закрывают? Вот в таких случаях и полезен finally. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 14:01 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
>Обьясните, пожлауйста, каким образом auto_ptr может помочь при нехватке памяти. При любом исключении, а не только при нехватке памяти гарантируется, что при раскрутке стека для всех автоматических объектов будут вызваны деструкторы. Следовательно, на каком бы вызове new не вылетел bad_alloc, гарантируется, что динамические ресурсы (не только память, но хендлы окон, хэндлы открытых файлов, хэндлы мьютексов) находившиеся под управление автоматических объетов (я не имею ввиду только std::auto_ptr, а любые другие scope guard), будут корректно возвращены системе. Если для вас и это не является весомым аргументов, то, извините, здесь вас "исправит только могила" или своиже "грабли" :). А ваша уверенность в том, что вы можете изолировать все исключения на самом нижнем уровне системы говорит лишь о том, что вы используете уже сложившийся стиль и что-либо менять для вас является не подъемной задачей - это я могу принять, но нельзя же этот подход насаждать как догму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 14:17 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Сорри, я ErV принял за Aklin. Я обращался к Aklin-у. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 14:20 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Голенков Владимир- если вас интересует случай new[], то тут используются std::vector, boost::shared_array (или еще чего), но не auto_ptrА что действительно нельзя? Вот я проверил: Код: plaintext 1. 2. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 14:57 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
ErV blindedДолжен разочаровать, в вашем понимании new ненормален. Он позволяет себе при нехватке памяти генерировать bad_alloc. Так что присоединяйтесь Обьясните, пожлауйста, каким образом auto_ptr может помочь при нехватке памяти. blindedА теперь объясни мне зачем весь это геморрой, если есть легкие классы оберток, которые все это закрывают? Вот в таких случаях и полезен finally. auto_ptr не поможет при нехватке, зато он освободит память и никакой finally не требуется еще раз Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 15:00 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Алексей К Голенков Владимир- если вас интересует случай new[], то тут используются std::vector, boost::shared_array (или еще чего), но не auto_ptrА что действительно нельзя? Вот я проверил: Код: plaintext 1. 2. Код: plaintext 1. А деструкторы все вызываются? То-то же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 15:03 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Стандарт явно говорит о том, что память выделенная с помощью new, new[] должна быть удалена с помощью delete, delete[] соответственно. То что на вашей платформе память, выделенная с помощью new[], может быть удалена с помощью delete, ни о чем не говорит - то есть, вам просто повезло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 15:12 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
blindedА деструкторы все вызываются? То-то жеТ. е. в случае с Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 15:13 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковСтандарт явно говорит о том, что память выделенная с помощью new, new[] должна быть удалена с помощью delete, delete[] соответственно. То что на вашей платформе память, выделенная с помощью new[], может быть удалена с помощью delete, ни о чем не говорит - то есть, вам просто повезло. Понял, отстал... :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 15:15 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
буду отвечать по некоторым поуктом, поскольку остальные либо копируются либо я уже отвечал. Код: plaintext 1. 2. как уже говорил, для этотго есть менеджеры. :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. никто вам не запрещает переписать SAFE_DELETE :) Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. авторА теперь объясни мне зачем весь это геморрой, если есть легкие классы оберток, которые все это закрывают? 1) у вас в руках мощнейшее средство разработки. а вы не знаете, что с ним делать. 2) вы сами же обрезаете много полезных возможностей этим. 3) если закрыть все преимущества си, получется vb. 4) определитесь: оберток (т.е. интерфейсов) или закрывают (т.е. затычек) ??? аффтопитезь: объект либо именован, либо не существует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 16:26 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковПри любом исключении, а не только при нехватке памяти гарантируется, что при раскрутке стека для всех автоматических объектов будут вызваны деструкторы. Следовательно, на каком бы вызове new не вылетел bad_alloc, гарантируется, что динамические ресурсы (не только память, но хендлы окон, хэндлы открытых файлов, хэндлы мьютексов) находившиеся под управление автоматических объетов (я не имею ввиду только std::auto_ptr, а любые другие scope guard), будут корректно возвращены системе. Если для вас и это не является весомым аргументов, то, извините, здесь вас "исправит только могила" или своиже "грабли" :). А ваша уверенность в том, что вы можете изолировать все исключения на самом нижнем уровне системы говорит лишь о том, что вы используете уже сложившийся стиль и что-либо менять для вас является не подъемной задачей - это я могу принять, но нельзя же этот подход насаждать как догму. 1) возвращение системе явно громозкое занатие. а если мне не надо их возвращять? программа начинает разваливаться при первом же исключении "нехватка памяти" судя по вашим словам. 2) я не вижу аргумента. точнее вижу что а) громозкость б) вы ставите затычки на язык в) перестаете контролироовать программу. 3) у меня нет такого убеждения, хотя говорилось, что это отлючается. у меня принцип "использовать исключения только в исклюительных случаях". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 16:32 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin Вы так ничего не ответили на счет исключений - как будет выглядеть ваш код, который должен быть безопастным по отношению к исключениям с SAFE_DELETE - вы что же предлагаете в каждой функции оперирующей new использовать try/catch/finally. А зачем эти сложности, если все достается почти даром, если поместить голый указатель под управление автоматического объекта - здесь фактически нет оверхеда, поскольку тотже auto_ptr легковесен и легко встаивается. Сравните: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. И вы утвержаете, что boo2() это вершина ради которой надо было создавать С++? Я очень глубоко в этом сомневаюсь. Код boo1 выразительней, он лишен шелухи, которую приходится писать придерживаясь вашего подхода в любой функции оперирующей динамическими ресурсами только ради того, чтобы сделать код безопасным по отношению к исключениям. Нечитаемость - это слишком большая цена в промышленном программировании. Вы утверждаете ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 16:46 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
blinded auto_ptr не поможет при нехватке, зато он освободит память и никакой finally не требуется еще раз Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. А зачем здесь ВООБЩЕ нужно было динамическое выделение памяти? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Aklin Код: plaintext 1. 2. 3. Можно вопрос? А зачем вам вообще SAFE_DELETE? Если инициализировать переменную изначально нулем, то никакой SAFE_DELETE, так как в качестве аргемента в delete/delete[] можно передавать нулевой указатель и удалять его сколько угодно... Если у вас был std::bad_alloc во время new, то, значит, в переменной у вас 0xcccccccc - если это отладочный билд и это MSVC, или неизвестно что, если это что-то другое. Соответственно, SAFE_DELETE вам не поможет. Если же в переменной был нуль, то SAFE_DELETE будет пустой тратой времени, так как нулевой указатель можно удалять: MSVC_help Using delete on a pointer to an object not allocated with new gives unpredictable results. You can, however, use delete on a pointer with the value 0. This provision means that, when new returns 0 on failure, deleting the result of a failed new operation is harmless. See The new and delete Operators for more information. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 16:47 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
2 Aklin Бог вам судья. Аминь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 16:53 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
если короче, резюмирую то, что мне пытались объяснить про auto_ptr 1) это либо затычка либо интерфейс (сами они еще не поняли) 2) это громозко (в плане конечного кода) и плохо контролируется 3) это БАЛЬШОЙ универсальный менеджер (+неконтролируемый) 4) накладываются ограничения. аффтопитезь: объект либо именован, либо не существует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 17:02 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Касательно auot_ptr - какой в нем смысл, если он даже подсчетом ссылок на указатель не занимается? Возникла мысль, что в случаях, когда требуется авто-униктожение обьектов, часто можно просто обойтись без динамического выделения памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 17:04 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков2 Aklin Бог вам судья. Аминь :) я вот что: даже заосмневался а может я неправ. и проверил: накаих исключений. ПРЕКРАСНО работающий new и SAFE_DELETE. прекрасно вызывающиеся деструкторы... и все в этом духе. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 17:04 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
ErV Можно вопрос? А зачем вам вообще SAFE_DELETE? new так же как и элементарный calloc (malloc) возвращяют 0 при отсутствии памяти. если вы НЕ использовали указатель (даже не занулили), то это ошибка ВАШЕГО кода, которая и приводит к утечкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 17:10 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklinесли короче, резюмирую то, что мне пытались объяснить про auto_ptr 1) это либо затычка либо интерфейс (сами они еще не поняли) 2) это громозко (в плане конечного кода) и плохо контролируется 3) это БАЛЬШОЙ универсальный менеджер (+неконтролируемый) 4) накладываются ограничения. аффтопитезь: объект либо именован, либо не существует Вообще, в некоторых случаях я писал свой класс, который был более легковесным аналогом вектора. Темплейт, создающий динамический массив из элементов. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 17:13 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
ErV это можно назвать короче, "manager" (memory mgr). я уже про это говорил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 17:16 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin ErV Можно вопрос? А зачем вам вообще SAFE_DELETE? new так же как и элементарный calloc (malloc) возвращяют 0 при отсутствии памяти. если вы НЕ использовали указатель (даже не занулили), то это ошибка ВАШЕГО кода, которая и приводит к утечкам. Я имел в виду следующее - если вам возвращается 0, зачем вам SAFE_DELETE? Что он делает? Нулевые указатели можно удалять, и это не дает ошибок. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 17:16 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
ErV Aklin ErV Можно вопрос? А зачем вам вообще SAFE_DELETE? new так же как и элементарный calloc (malloc) возвращяют 0 при отсутствии памяти. если вы НЕ использовали указатель (даже не занулили), то это ошибка ВАШЕГО кода, которая и приводит к утечкам. Я имел в виду следующее - если вам возвращается 0, зачем вам SAFE_DELETE? Что он делает? Нулевые указатели можно удалять, и это не дает ошибок. Код: plaintext 1. 2. 3. 4. точно не помню, можно ли удалять нулевые указатели, но обнуление точно помогает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 17:28 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklinточно не помню, можно ли удалять нулевые указатели, но обнуление точно помогает. И ещё раз цитирую: C++_reference Using delete on a pointer to an object not allocated with new gives unpredictable results. You can, however, use delete on a pointer with the value 0. This provision means that, when new returns 0 on failure, deleting the result of a failed new operation is harmless . See The new and delete Operators for more information. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 17:36 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Создавать функции типа SAFE_DELETE только если обьект освобождается как-то по-другому, например, если это COM объект, для освобождения которого надо вызвать release, а вызов Release() с нулевого указателя даст, ясен пень, AccessViolation. Кстати, есть более (ИМХО) удобный вариант, чем макросы. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2007, 17:40 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Я не Анатолий, ручки не сложу Сначала про new Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plaintext 1. 2. 3. Что касается кода который я привожу? не надо воспринимать его буквально от а-я. Это всего лишь попытка смоделировать ситуацию, не более того. ( см ). Я просто пытался показать что происходит если генерацию исключения и его обработку разделяют несколько уровней вложенности в которых также динамически создаются объекты. Теперь на счет auto_ptr. Люблю я людей рассуждающих о вкусе устриц не разу их не попробовав. Хоть бы из любопытсва взяли и посмотрели что это. Ну ладно коротенько перескажем это маленький шаблон - обертка(proxy) вся задача которого отслеживать время жизни указателя. У него масса недостатков. и одно гигантское достоинство - он стандартный. А что касается кривизны кривизны моих рук и не знания что делать выданным мне инструментом. Ну это по крайней мере безосновательно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2007, 19:04 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
blinded для gcc есть рабочий free и calloc(malloc). что касается того что я не пробовал auto_ptr вы глубоко залуждаетесь, провел два часа в этой беседе и пока не понял никаких плюсов, зато написал (см. выше) "запутанный код" и "неконтролируемость". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2007, 20:31 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin blinded для gcc есть рабочий free и calloc(malloc). что касается того что я не пробовал auto_ptr вы глубоко залуждаетесь, провел два часа в этой беседе и пока не понял никаких плюсов, зато написал (см. выше) "запутанный код" и "неконтролируемость". Ну мы же не на С свами пишем. Да и отделение выделения памяти от вызова конструктора ни к чему хорошему не приведет, Ну что до запутанности кода и неконтролируемости - это вы не научились им подьзоваться. Кстати должен вас огорчить, в грядущий стандартбудет включено несколько новых smart указателей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2007, 21:20 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
blindedТеперь на счет auto_ptr. Люблю я людей рассуждающих о вкусе устриц не разу их не попробовав. Хоть бы из любопытсва взяли и посмотрели что это. Посмотрел. Не понравилось - криво и неудобно, замедляет код при частом обращении к указателю. blinded У него масса недостатков. и одно гигантское достоинство - он стандартный. Ну и что, что стандартный? Вы когда (если) под Win пишете, вы GlobalAlloc, например используете? Он тоже (для Win) стандартный... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2007, 22:34 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
blinded другими словами ничего нового сказть никто больше может. кроме того мне никто не запрещает сделать макрос по конструкции try{new...}...{...} например SAFE_NEW. это дудет переносимо и не станет обращаться к внешним библиотекам. кстати, new не только стандартный, он еще и есть основа языка си, а auto_ptr - лишь оболочка (затычка) которую поставляют ко всем компиляторам. это то же, если бы к кажжлму компилятору я бы прибавлял еще "hello world" функцию или вроде того. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 10:20 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
С тех пор как я начал пользоваться умными у меня стало значительно меньше ошибок связанных с неправильной работой с памятью. Вообще помоему это очень полезная вещь. ErV Посмотрел. Не понравилось - криво и неудобно, замедляет код при частом обращении к указателю. Я когда-то смотрел, на gcc (версию уже не помню). При отключенной оптимизации есть замедление, а при включенной никакого замедления нет, std::auto_ptr и boost_scoped_ptr работают так же как обычный указатель. boost::shared_ptr работает медленнее. Aklin другими словами ничего нового сказть никто больше может. кроме того мне никто не запрещает сделать макрос по конструкции try{new...}...{...} например SAFE_NEW. это дудет переносимо и не станет обращаться к внешним библиотекам. И чем это лучше auto_ptr-а? Он тоже стандартен, переносим и не требует внешних библиотек. Кому нужны эти макросы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 11:37 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Sandro_KИ чем это лучше auto_ptr-а? Он тоже стандартен, переносим и не требует внешних библиотек. Кому нужны эти макросы? std то вы подключаете. макросы? gcc ругается, если нет памяти, и это обходиться макросами. простое и понятное рещение. не запутывающее код. причем контроль остается на том же уровне. свобода не изменяентся также. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 11:40 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin std то вы подключаете. Если я пишу на C++ то я подключаю стандартную бублиотеку С++ независимо от того использую я auto_ptr или не использую. auto_ptr это небольшой шаблон, в который оборачивается указатель, никаких библиотек он не использует. Aklin макросы? gcc ругается, если нет памяти, и это обходиться макросами. простое и понятное рещение. не запутывающее код. причем контроль остается на том же уровне. свобода не изменяентся также. Мне не кажется что это проще и понятнее чем std::auto_ptr или boost::scoped_ptr. То что контроль не остается на том же уровне это как-раз и помогает избежать многих ошибок с указателями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 11:55 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Sandro_K подыдожу, что бы все поняли, о чем идет речь 1) те, кто используют auto_ptr не знают что это : интерфейсм или затычка 2) кто-то сказал, что это манагер. я уже говорил, что собственные манагеры быстрее, понятней и удобней 3) контроль над программой падает. также мне интересен вопрос о переносу указателей через третьи руки. скажем a=new b=a c=b причем c из другой функции. что на это ответит auto_ptr ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 12:01 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin подыдожу, что бы все поняли, о чем идет речь 1) те, кто используют auto_ptr не знают что это : интерфейсм или затычка 2) кто-то сказал, что это манагер. я уже говорил, что собственные манагеры быстрее, понятней и удобней 3) контроль над программой падает. 1) Можете называть как хотите (интефейс, затычка, менеджер) суть от этого не изменится. 2) Если ваш менеджер понятнее и удобнее для вас, то это не значит что он будет понятнее и удобне для всех. А будет ли собственный менеджер будет быстрее это еще не известно. 3) Контроль над программой не падает, он наоборот увеличивается. Aklin также мне интересен вопрос о переносу указателей через третьи руки. скажем a=new b=a c=b причем c из другой функции. что на это ответит auto_ptr ? Отличный пример! 3 указателя на одну область памяти, можно легко запитаться и освободить память 2 раза или использовать указатель на уже освобожденную память, или просто забыть освободить память, или еще что-нибудь. Объясните конкретнее, что именно вы хотите сделать, тогда можно будет решить, какой из умных указателей здесь лучше применить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 12:46 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin 1) те, кто используют auto_ptr не знают что это: интерфейсм или затычка определение интерфейса мне известно растолкуйте пожалуйста термин "затычка", дабы не было разночтений 2) кто-то сказал, что это манагер. я уже говорил, что собственные манагеры быстрее, понятней и удобней "манагер" "манагеру" рознь: бывают разные задачи и стратегии их решения что именно вы имели в виду? а то похоже на "сравнение теплого с мягким" плюс вам не кажется что "понятней и удобней" это прежде всего дело вкуса и привычек? а вот "быстрее" нуждается в обосновании 3) контроль над программой падает. что есть "падения контроля" в контексте применения auto_ptr? поведение объекта класса внутри области видимости четко детерменированно также мне интересен вопрос о переносу указателей через третьи руки. а можно содержательный компилируемый пример? т.е. проблема + ваш вариант ее решения йожу понятно, что не зачем пихать auto_ptr во все дыры, только там где полезно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 12:54 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Sandro_K1) Можете называть как хотите (интефейс, затычка, менеджер) суть от этого не изменится. 2) Если ваш менеджер понятнее и удобнее для вас, то это не значит что он будет понятнее и удобне для всех. А будет ли собственный менеджер будет быстрее это еще не известно. 3) Контроль над программой не падает, он наоборот увеличивается. 1) это СОВЕРШЕННО разные понятия -интерфейс - для удобства программирования, код, который многий исзользуют, но в отдельнм файле + интерфейс -затычка - закрытие некой дыры (+урезние возможностей) -менеджер - центрированное управление 2) специальный менеджер для отдельно взятой задачи быстрее и понятней для всех, кто ее пишет. (auto_ptr - швейцарский ножик) 3)когда я поигрался с auto_ptr: я вот не понимаю, в какой момент будут удалены те или иные куски. и не нашел, кто бы мне это указал. Sandro_KОтличный пример! 3 указателя на одну область памяти, можно легко запитаться и освободить память 2 раза или использовать указатель на уже освобожденную память, или просто забыть освободить память, или еще что-нибудь. Объясните конкретнее, что именно вы хотите сделать, тогда можно будет решить, какой из умных указателей здесь лучше применить. вы АСБОЛЮТНО ничего не поняли. если я использую свой меенеджер или не исользую его вообще, то память беру и освобождаю только там, где МНЕ это надо. меня интересовала точка зрения auto_ptr. также еще интересен вопрос: Код: plaintext 1. 2. или Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 12:55 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin также мне интересен вопрос о переносу указателей через третьи руки. скажем a=new b=a c=b причем c из другой функции. что на это ответит auto_ptr?объект будет доступен через с, а код SAFE_DELETE(a); SAFE_DELETE(b); SAFE_DELETE(c); сломает кучу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 12:59 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklinвы АСБОЛЮТНО ничего не поняли. если я использую свой меенеджер или не исользую его вообще, то память беру и освобождаю только там, где МНЕ это надо. меня интересовала точка зрения auto_ptr.если на пальцах, то удаляет объект, когда ты его перестаёшь использовать. Aklin также еще интересен вопрос: Код: plaintext 1. 2. или Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 13:04 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin Я вижу в совершенно не понимаете как работает auto_ptr, и для чего он нужен. Советую сначала разобраться, что же такое умные указатели, а потом уже утверждать нужны они или не нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 13:14 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
Aklin Sandro_K подыдожу, что бы все поняли, о чем идет речь 1) те, кто используют auto_ptr не знают что это : интерфейсм или затычка 2) кто-то сказал, что это манагер. я уже говорил, что собственные манагеры быстрее, понятней и удобней 3) контроль над программой падает. также мне интересен вопрос о переносу указателей через третьи руки. скажем a=new b=a c=b причем c из другой функции. что на это ответит auto_ptr ? 1) а что вы понимаете под одним и другим. А по научному это называется proxy 2) ну вообще-то под менеджером памяти понимается отличное от того о чем вы сдесь говорили. тот пример ErV это не менеджер памяти - это proxy. Ну то что они понятней - это смотря кому, автору - да, тем кто его использует в темную - нет. И в этом отношении я отдам предпочтение стандартному классу. 3) интересно что подумает ваш приемник, когда увидит ваш доморощенный proxy написанный под конкретный случай? А насчет указателей там все просто Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 13:23 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
blinded Код: plaintext 1. 2. 3. 4. На мой взгляд очень неудобно, и не стоит использовать по следующей причине: 1) Нарушает стандартное поведение операторов C++. Я думаю, что любого нормального программера повергнет в изумлеение, если в выражении int i = 3; int a = i; printf("i: %d, a: %d",i,a); i к моменту вызовва printf будет равно нулю. Именно это делает auto_ptr; 2) вы выше показали пример, в котором используется auto_ptr. Получается, что auto_ptr нельзя присвоить "не auto_ptr" указатель. Для меня, например, это был бы довольно логичный вариант инициализации. По-моему, это недочет убивает все его достоинства (которых я так особо и не улицезрел) - вместо нормального указателя получается помесь указателя, ссылки и локальной переменной... Память в момент присваивания было бы не так уж сложно высвободить. 3) чтобы решить проблемы с забытыми массивами, может тогда уже сразу заюзать смарт-поинтеры? Нормально реализованные, которые бы поддерживали подсчет ссылок на область, и динамически создавали бы дубликат исходного вариант области при попытке доступа к ней на запись. Вот этот вариант я ещё могу понять. Кстати, что вам мешает с auto_ptr сделать вот это: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 17:30 |
|
||
|
auto_ptr или new + delete
|
|||
|---|---|---|---|
|
#18+
ErV blinded Код: plaintext 1. 2. 3. 4. На мой взгляд очень неудобно, и не стоит использовать по следующей причине: 1) Нарушает стандартное поведение операторов C++. Я думаю, что любого нормального программера повергнет в изумлеение, если в выражении int i = 3; int a = i; printf("i: %d, a: %d",i,a); i к моменту вызовва printf будет равно нулю. Именно это делает auto_ptr; 2) вы выше показали пример, в котором используется auto_ptr. Получается, что auto_ptr нельзя присвоить "не auto_ptr" указатель. Для меня, например, это был бы довольно логичный вариант инициализации. По-моему, это недочет убивает все его достоинства (которых я так особо и не улицезрел) - вместо нормального указателя получается помесь указателя, ссылки и локальной переменной... Память в момент присваивания было бы не так уж сложно высвободить. 3) чтобы решить проблемы с забытыми массивами, может тогда уже сразу заюзать смарт-поинтеры? Нормально реализованные, которые бы поддерживали подсчет ссылок на область, и динамически создавали бы дубликат исходного вариант области при попытке доступа к ней на запись. Вот этот вариант я ещё могу понять. Кстати, что вам мешает с auto_ptr сделать вот это: Код: plaintext 1. 2. 3. 1)Да несколько непривычно, вот только надо внимательнее смотреть на сигнатуру у всех SomeClass& operator=(const SomeClass&); а у этого она иная SomeClass& operator=(SomeClass&) ну так это проблема довольно распространенная. 2)это почему же нельзя, вот так все правильно Код: plaintext 1. 2. 3) Да ктобы спорил что быть счастливым и богатым лучше чем бедным и больным. Одна беда нестандартные они, знаешь как донимает когда у тебя несколько сторонних пакетов, в каждом из которых свой smart pointer? Вот примут C++0x полегчаетю А вот создание дубликата это вообще-то не семантика указателя. Да и что делать с опретором -> он ведь не указатель на константный объект, а вот читать лм вы будете или писать не ясно. Да и подсчет ссылок это уже не что-то невесомое, особенно в многопоточной задачке. (хотя опять же готов пойти на жертвы) А что касается segmentation violation, это да, это плохо. Но это вопрос исторический. Это гуру напутали, а потом решили что так правильнее, чем ошибки в стандартных алгоритмах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2007, 18:46 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2029240]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 209ms |
| total: | 376ms |

| 0 / 0 |
