|
|
|
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?fid=57&msg=34399718&tid=2029240]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
329ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 687ms |

| 0 / 0 |
