Re[10]: Garbage collection vs manual memory management
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.01.15 21:10
Оценка: +1
Здравствуйте, __kot2, Вы писали:

__>>>да просто открытие файлов в цикле должно падать

G>>Проверь
G>>
G>>static void Main(string[] args)
G>>{
G>>    for (int i = 0; i < 1000000; i++)
G>>    {
G>>        new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
G>>    }
G>>}
G>>

G>>Не падает
__>ну, в общем-то интересная задачка наверное. я бы чтобы добиться падения попробовал бы рандомное имя файла давать и еще что-нить читать оттуда, чтобы гарантировать открытие. а то вдруг оно там ленивое? или в оптимизаторе дотнетовском стоит каколй-нить if — типа в цикле если файлы открываем, но не читаем, то не открывать их

Ага, магия прям.

Но ты не стесняйся, глянь исходники http://referencesource.microsoft.com/mscorlib/system/io/filestream.cs.html
Никакой магии, честно зовется Win32Native.SafeCreateFile, который по сути CreateFile из WinAPI
Естественно оптимизатор ничего не знает о то, что такое FileStream, да и запускал под дебагом.



__>>>если хотите просимулировать то, о чем я говорю — вставьте в начала частоиспользуемых ф-ий вашего приложение по открытию файла и оно у вас начнет непрдесказуемым способом падать в разных местах по out of resources

G>>Не будет.
__>я сам сталкивался недавно с этим. создаешь просто пару сотен потоков и начинаешь в них что-то делать. у тебя то там, то там out of resources
Да ладно?
        static void Main(string[] args)
        {
            for (int i = 0; i < 300; i++)
            {
                new Thread(() =>
                {
                    for (int j = 0; j < 1000000; j++)
                    {
                        new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                    }
                }).Start();
            }
        }

Не падает.

Готов спорить что ты сталкивался с тем, что у тебя кривые руки и ты не знаешь .NET.

G>>Ты только что расписался, что не знаешь как работает GC и .NET вообще.

__>а он что, может отловить когда handle закончились? он смотрит на оставшуюся память. откуда он знает, что у нас еще и лимит по хэндлам или там, потокам?
А зачем ему это знать? Сборшик мусора срабатывает на 256к памяти, старые хендлы в этот момент закроются. Лимит в винде около миллиона, посчитаешь сам почему ГЦ не должен знать сколько там лимит?

__>раньше был лимит по файловым хэндлам вроде около 5000 сейчас по-моему его тысяч до 100 увеличили как раз по причине что падает вся Явовское-дотнетовское. ну да, решение в духе этих языков. есть же другие лимиты — на потоки, на графические примитивы, на, там, кто его знает что еще. не только в обьеме памяти дело.

16 тысяч был еще до w95, и то только потому что внтури хранилось в духбайтном слове, а хендл был кратным 4. Начиная с W2000 стало двойное слово и убрали кратность 4, стало 2М хнедлов. Так практически везде — потоки, сокеты итп. В последних версиях МСДН даже убрали эти значения, ибо практически их достичь невозможно, память раньше кончится. (если не в курсе, то за каждым хендлом стоит структура в ядре, которая занимает сильно больше 4 байт).

Но это не имеет никакого значения, так как .NET не допускает утечек и надо что-то специально делать, чтобы лимитов достичь.
Это в C++ является проблемой, а в .NET — нет.


__>>>понимаете, что вы просто вручную уничтожаете обьект? не бывает никаких init и dispose. бывает создание и уничтожение обьекта. а то, что оно разбито на два этапа это извращения, на которые приходится идти ради совместимости с другими нерабочими великими идеями. в этом плане вызов Dispose в C# или delete в С++ ничем не отличается. разве что в первом случае вы получаете говнообьект, а в С++ вы д-но его диспозите

G>>Это ты пытаешься на любом языке писать как на C++.
G>>А в реальности не бывает никаких объектов, бывает вызов метода closehandle, который "закрывает" файл. То есть дает доступ другим приложениями в случае эксклюзивного доступа, а также сбрасывает буфер на диск. Если того и другого не треубется в данный момент, то в .NET можно dispose не звать.
__>что значит не требуется в данных момент? у вас будет расти и расти занятость системы, а вы будете бороться с этим увеличением лимитов вместо того, чтобы искать где там что не дисплозится и переписывать код на using.
С чего это "занятость системы" будет расти? Если нет ссылок на объект, то за один проход GC он удалится, и ничего расти не будет. Сборка мусора в поколении 0 выполняется порядка 100 раз в секунду, так что ты даже не увидишь чтобы что-то росло. Ты походу вообще не понимаешь как работает ОС и .NET.


__>одна малюсенькакая дотнетовская какашечка чисто теоретически может зажрать сколько угодно памяти и сколько угодно ресурсов. поэтому и приходится писать using

Ну ты уже расписался в непонимании, можешь не продолжать. Я тебе пример кода без using привел, запусти и посмотри как он расходует ресурсы.
Ты до сих пор не понимаешь, что даже если не писать using никаких утечек не будет.


G>>Это в C++ важна работа с объектами, ибо она эквивалентна работе с памятью. А в других (нормальных) яызках ты не с объектами работаешь, а с результатом, который нужно получить. Если нужно чтобы после выполнения функции данные гарантированно записались в файл, то ты вызываешь dispose.

G>>dispose и delete кстати отличается очень сильно. Но я уж понял, что все что ты пишешь основано на незнании .NET. Ранее ты умудрился using приравнять к auto_ptr
__>ха-ха-ха как смищьно
Тебе смешно, что ты не знаешь что такое auto_ptr и using?

__>перефразируя поговорку микрософтовскую "ты просто слишком долго пишешь на .NET". обьект создается и уничтожается. всё. больше с ним ничего не может происходить. наличие промежуточных шагов — лисапеды и бесконечное болото для ошибок.

Какой объект? CloseHandle надо вызвать. Это в C++ модно (потому что более безопасно чем любой другой подход) всеподряд привязывать к уничтожению объекта. Но это не значит, что в любом языке так стоит делать. Ты же ничего кроме C++ не знаешь (да и его плохо судя по всему), поэтому и пишешь фигню. Бросай, лучше учебники читай.


__>у нас дело может до close не дойти из-за возникшего по дороге исключения.

Ну да, не придумали try\finally конструкцию в C++, поэтому все в деструкторах. В других языка есть другие средства (к счастью).

__>именно поэтому я и писал про auto_ptr капк гарантия уничтожения обьектов на куче при любом выходе из области видимости, если до тебя еще не дошло

Да и до сих пор не дошло что ты хочешь сказать...
Что using дает гарантию уничтожения объекта при выходе из области? Так не дает, можно за пределами using обратиться к объекту, IDisposable это не уничтожение объекта.
Ты какую то фигню сморозил, тем более ты не знаешь как работает auto_ptr, я же говорю попробуй его в метод передать.


G>>Ты наверное все еще не понял, что в 99% случаев если не вызвать dispose, то ничего страшного не случится. Поэтому глупо приравнивать dispose к разрушению объекта. Но я уж понял, что все что ты пишешь основано на незнании .NET

__>конечно это не разрушение. это лисапед — полуразрушение
Что значит "полуразрушение" ? Ты о чем вообще? Лисапед для чего?

G>>Чувак, я знаю C++ (и судя по твоему комменту ниже — знаю лучше тебя), это ты не знаешь .NET

__>а смысл знать .NET ?
Чтобы моз работал, а не раскисал.

Кстати а зачем тебе знать C++?


__>он не годится для серверной стороны, так там там линукс везде

Странно, более 10 лет пишу исключительно серверные приложения на .NET. Так что "везде" это только в твоем воображаемом мире. Вот например этот форум вовсе не на линуксе.
Там где не .NET, там Java, а C++ днем с огнем не сыщешь.

__>он не годится для гуя — так как он сейчас весь вебовский и нужно копать что-то в сторону типизованного жабоскрипта

То есть C++ тоже не годится.

__>он не годится для каких-то вычислений из-за корявой модели памяти.

Как связаны модель памяти и вычисления? Массив в .NET отличается от массива в C? Или ты о чем? Опять какой-то воображаемый мир у тебя.
Да и зачем тут С++, когда все вычисления пишутся на голом C?

__>он был просто создан как замена С++ для внутренних проектов Микрософта.

Опять воображаемый мир? Историю почитай чтоли. .NET создали когда Sun не допустил лицензирование виртуальной машины Java с расширениями MS.

__>Никто другой в здавом уме его использовать не будет

Чувак, ты пишешь на форуме, который на .NET, ты считаешь его создателей ненормальными?


__>С++ый проект внутри MS контролировать невозможно в принципе никаким образом.

Странно, как же Office Team уже 20 лет офис делает?

__>C# ый — да, он тормозит и еле работает, ну по крайней мере он не так часто падает. Всё остальное уже вторично

Вот тебе и ответ, изучай .NET — научишься делать программы, которые не падают.

G>>Во-первых просто не скомпилируется.

__>ну ясен пень
А зачем постить такой код, в котором ты даже сам не разбираешься?


G>>Во-вторых ты походу не знаешь разницу между auto_ptr и unique_ptr.

G>>В-третьих попробуй передать куда-либо auto_ptr.
__>auto_ptr был создан как раз с целью using — гарантированное уничтожение обьекта при выходе из scope при возникновении исключения. он был создан миллион лет назад и давно уже obsolete.

Ты упоротый чтоли? Цель using — не "гарантированное уничтожение", а только лишь гарантированный вызов dispose. Dispose может делать что угодно, даже не связанное с уничтожением.
Кстати для справки — IDisposable в .NET может реализовывать даже структура для которой нет никакого "уничтожения".
Читай учебник и не пиши глупости.


__>>>вот это повредение и пытается симулировать C# со своим Dispose

G>>Пойди учебник почитай, не пиши глупостей.
__>учебник по C#? да я лучше на шиномонтаж работать пойду, чем снова на C# писать
Ну судя по твоим знаниям — на шиномонтаже тебе самое место
Re[11]: Garbage collection vs manual memory management
От: __kot2  
Дата: 18.01.15 21:24
Оценка: -1
Здравствуйте, AlexRK, Вы писали:
__>>а смысл знать .NET ?
__>>он не годится для серверной стороны, так там там линукс везде
__>>он не годится для гуя — так как он сейчас весь вебовский и нужно копать что-то в сторону типизованного жабоскрипта
__>>он не годится для каких-то вычислений из-за корявой модели памяти.
ARK>Есть и другие места применения, помимо перечисленных. Я, помимо прочего, участвую в разработке ГИС на C#.
отличная идея. и как это собираются портировать на iphone/ipad/web? — самые быстрорастущие и денежные рынки? хотя, наверное это советский продукт, раз mac os в пролете? но даже совесткие смартфоны андроидовские

__>>он был просто создан как замена С++ для внутренних проектов Микрософта. Никто другой в здавом уме его использовать не будет С++ый проект внутри MS контролировать невозможно в принципе никаким образом. C# ый — да, он тормозит и еле работает, ну по крайней мере он не так часто падает. Всё остальное уже вторично

ARK>Тупой бред.
я там работал
Re[12]: Garbage collection vs manual memory management
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.01.15 21:30
Оценка:
Здравствуйте, __kot2, Вы писали:

ARK>>Есть и другие места применения, помимо перечисленных. Я, помимо прочего, участвую в разработке ГИС на C#.

__>отличная идея. и как это собираются портировать на iphone/ipad/web? — самые быстрорастущие и денежные рынки? хотя, наверное это советский продукт, раз mac os в пролете? но даже совесткие смартфоны андроидовские

Ты совсем от жизни отстал? Про Xamarin и Unity вообще не слышал? А про .NET Core?
Re[13]: Garbage collection vs manual memory management
От: __kot2  
Дата: 18.01.15 23:56
Оценка: -1
Здравствуйте, gandjustas, Вы писали:
G>Ты совсем от жизни отстал? Про Xamarin и Unity вообще не слышал? А про .NET Core?
это как в Советском Союзе? Сначала создать проблему, а потом героически ее преодолевать?
Re[14]: Garbage collection vs manual memory management
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.01.15 00:03
Оценка:
Здравствуйте, __kot2, Вы писали:

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

G>>Ты совсем от жизни отстал? Про Xamarin и Unity вообще не слышал? А про .NET Core?
__>это как в Советском Союзе? Сначала создать проблему, а потом героически ее преодолевать?
Ты не в курсе, что .net был создан сильно до того, как появились все эти платформы?
Re[15]: Garbage collection vs manual memory management
От: __kot2  
Дата: 19.01.15 01:37
Оценка: -2
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, __kot2, Вы писали:
__>>Здравствуйте, gandjustas, Вы писали:
G>>>Ты совсем от жизни отстал? Про Xamarin и Unity вообще не слышал? А про .NET Core?
__>>это как в Советском Союзе? Сначала создать проблему, а потом героически ее преодолевать?
G>Ты не в курсе, что .net был создан сильно до того, как появились все эти платформы?
а С++ когда был создан?
есть очень простой критерий удачности решений/технологий
хорошие решения имеют приятные неожиданные побочные эффекты
плохие решения имеют неприятные неожиданные побочные эффекты

это самый лучший в мире и 100% рабочий критерий грамотности какой-то разработки — попробовать применить ее в области для которой она не создавалась.
Re[16]: Garbage collection vs manual memory management
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.01.15 08:29
Оценка: -1 :)
Здравствуйте, __kot2, Вы писали:

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

G>>Здравствуйте, __kot2, Вы писали:
__>>>Здравствуйте, gandjustas, Вы писали:
G>>>>Ты совсем от жизни отстал? Про Xamarin и Unity вообще не слышал? А про .NET Core?
__>>>это как в Советском Союзе? Сначала создать проблему, а потом героически ее преодолевать?
G>>Ты не в курсе, что .net был создан сильно до того, как появились все эти платформы?
__>а С++ когда был создан?
В 2011 году, все предыдущие версии безнадежно больны и практически неизлечимы (неприятные побочные эффекты, ага).

Но и это не играет никакой роли, ибо никакого универсального фреймворка, работающего более чем на одной платформе в принципе нет для C++.
Про Qt даже не вспоминай, выглядит как говно, в приличном обществе сразу по лицу за такое бьют.

В итоге вместо универсальности ты получишь N разных codebase для N разных платформ. Желаю удачи в поддержке.
Re[17]: Garbage collection vs manual memory management
От: __kot2  
Дата: 19.01.15 15:29
Оценка: -1
Здравствуйте, gandjustas, Вы писали:
G>>>>>Ты совсем от жизни отстал? Про Xamarin и Unity вообще не слышал? А про .NET Core?
__>>>>это как в Советском Союзе? Сначала создать проблему, а потом героически ее преодолевать?
G>>>Ты не в курсе, что .net был создан сильно до того, как появились все эти платформы?
__>>а С++ когда был создан?
G>В 2011 году, все предыдущие версии безнадежно больны и практически неизлечимы (неприятные побочные эффекты, ага).
я вообще понять не могу о чем разговор даже. С++ всегда был рабочим и всегда подходил для разработки. С++ 11 это обычные мелкие доработочки, чтобы каждые свой велосипед не городили посредствами языка, стандартные решения были стандартизованы.

G>Но и это не играет никакой роли, ибо никакого универсального фреймворка, работающего более чем на одной платформе в принципе нет для C++.

G>Про Qt даже не вспоминай, выглядит как говно, в приличном обществе сразу по лицу за такое бьют.
Qt лучший фреймворк среди всех существующих.

G>В итоге вместо универсальности ты получишь N разных codebase для N разных платформ. Желаю удачи в поддержке.

я портировал С++ десктопные приложения на iphone. Раз плюнусть.

ты реально какой-то наркоман. засим прекращаю нашу тут дискуссию. не вижу смысла вообще ее вести
Re[18]: Garbage collection vs manual memory management
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.01.15 15:50
Оценка:
Здравствуйте, __kot2, Вы писали:

__>Qt лучший фреймворк среди всех существующих.

__>ты реально какой-то наркоман.

Из нас двоих наркоман совсем не я
Re[19]: Garbage collection vs manual memory management
От: __kot2  
Дата: 19.01.15 16:43
Оценка:
Здравствуйте, gandjustas, Вы писали:
G>Из нас двоих наркоман совсем не я
признание проблемы — первый шаг к излечению
Re: Garbage collection vs manual memory management
От: vdimas Россия  
Дата: 19.01.15 17:37
Оценка:
Здравствуйте, johny5, Вы писали:

J>Общались с Джавистом пересевшим на С++. Мол висящие указатели, явная чистка памяти, и т.д. Всё это плохо и известно. Он предлагает универсальное решение — shared_ptr на всё. Я задал контрольный вопрос: есть кнопка, к ней привязан звук из менеджера звуков. Мы решили перегрузить менеджер звуков. Нам для этого старый нужно удалить а в новом все звуки загрузить заново. И что я слышу от него, оказывается это нормально в данном случае что кнопка на UI не даст старому звуковому менеджеру умереть!! А если там нужно драйвер переиниализировать, старый обязательно должен выгрузить своё.


Стандартный паттерн для таких сценариев — это приведение отношения использования из oo:1 к 1:1 и нам достаточно будет затем сделать подмену указателя только в одном месте. Делается опять же стандартно через ровно +1 к уровню косвенности...


J>Я до сих пор в шоке. Это ужос для С++ профессионала, вдруг оказаться в языке где ты не можешь контролировать жизнь объектов вокруг тебя.

J>Я сам С++ник и безуспешно пытался пересесть на С#. Я поимел реальных проблем с тем что я впринципе не имею никакого контроля над временем жизни объектов мной созданных.

Disposable паттерн тебе в помощь. Прекрасно точно так же все работает. Для особо клинических случаев, например, когда мы "что-то отдаем наружу", и "там" ожидается клиническое поведение, есть даже GCHandle, создаваемый как weak. Либо опять же предыдущий способ.


J>К примеру загрузил я файл в модель, отобразил модель на форму и всё, хочу удалить и загрузить новую модель, но я не могу потому что в языке просто нет таких средств. Всё что тут можно сделать это подчистить везде везде везде ссылки на эту форму, на модель и скрестить пальцы что скоро всё само удалится. И всё равно не срабатывает в 50% случаях.


Если нет статических ссылок и прочего лишнего кеширования, то в 99.99% случаев и пальцы скрещивать не надо. А если есть, то опять же способ борьбы уже был дан.
Re[9]: Garbage collection vs manual memory management
От: Константин Россия  
Дата: 19.01.15 19:35
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Причем если ты привязывает сайд-эффект к деструктору (RAII), то появляется другая проблема, ты не можешь объект передать куда-либо, ибо вызовется конструктор копии, для которого вызовется деструктор, который вызовет эффект раньше времени. Можно, конечно, передать голый указатель , но тогда проблема со временем жизни появляется, можно передать защищенный указатель (ссылку)?


Эта рассуждение устарело после выхода C++11. Move-only типы решают вопрос передачи владения. В стандартной библиотеке пример move-only типа std::unique_ptr. Обёртка над файлом отличный кандидат на move-only:

File create_file(const string& path);
Re[10]: Garbage collection vs manual memory management
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.01.15 19:45
Оценка: -2
Здравствуйте, Константин, Вы писали:

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


G>>Причем если ты привязывает сайд-эффект к деструктору (RAII), то появляется другая проблема, ты не можешь объект передать куда-либо, ибо вызовется конструктор копии, для которого вызовется деструктор, который вызовет эффект раньше времени. Можно, конечно, передать голый указатель , но тогда проблема со временем жизни появляется, можно передать защищенный указатель (ссылку)?


К>Эта рассуждение устарело после выхода C++11. Move-only типы решают вопрос передачи владения.


Это тоже костыль для небезопасных указателй и автоматических деструкторов.
Re[18]: Garbage collection vs manual memory management
От: Константин Россия  
Дата: 19.01.15 19:50
Оценка: +3
Здравствуйте, __kot2, Вы писали:

__>С++ 11 это обычные мелкие доработочки, чтобы каждые свой велосипед не городили посредствами языка, стандартные решения были стандартизованы.

-1

Ни фига себе мелкие доработки:
— move семантика
— возможность по-человечески использовать алгоритмы STL (лямбды)
— нормальный способ итерироваться по коллекциям без ужасов типа BOOST_FOREACH
— std::unique_ptr (нормальных аналогов до выхода C++11 не было)
— избавление от необходимости писать километровые имена типов (auto)
+ по мелочи variadic templates, constexpr, upgrade STL ...

Скажу больше,
— если человек когда-то писал на C++, но не делает это сейчас
— если человек пишет на C++, но не интересуется, не изучал С++11
то он не знает современный C++
Re[11]: Garbage collection vs manual memory management
От: Константин Россия  
Дата: 19.01.15 19:53
Оценка:
Здравствуйте, gandjustas, Вы писали:

К>>Эта рассуждение устарело после выхода C++11. Move-only типы решают вопрос передачи владения.


G>Это тоже костыль для небезопасных указателй и автоматических деструкторов.


Почему костыль? Вполне себе идиома объекта с единственным владельцем.
Аналогия: сорвал яблоко, отдал другому. Для этого не нужно считать число владельцев и создавать/убивать клоны яблок.
Re[12]: Garbage collection vs manual memory management
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.01.15 20:11
Оценка:
Здравствуйте, Константин, Вы писали:

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


К>>>Эта рассуждение устарело после выхода C++11. Move-only типы решают вопрос передачи владения.


G>>Это тоже костыль для небезопасных указателй и автоматических деструкторов.


К>Почему костыль? Вполне себе идиома объекта с единственным владельцем.

А зачем оно нужно? Единственность владельца важна в двух случаях — автоматическое удаление объекта, передача между потоками. Второе в С++ не реализовано, а первое является костылем для атоматических деструкторов, которые в свою очередь костыли для небезопасных указателей.
Re[19]: Garbage collection vs manual memory management
От: __kot2  
Дата: 19.01.15 21:37
Оценка: -1
Здравствуйте, Константин, Вы писали:
К>Ни фига себе мелкие доработки:
К>- move семантика
оптимизация — чтобы вместо по референсу по значению передавать. ну да, удобно, но ничего фундаментально нового

К>- возможность по-человечески использовать алгоритмы STL (лямбды)

не понял. шаблоны и раньше допускали ф-ии произвольные вставлять. синтаксис более удобный стал. может быть читаемость чуток повысилось. я вот без лямбд живу и ниче.
инлайнить функцию или отдельно ее выносить это неоднозначный вопрос.

К>- нормальный способ итерироваться по коллекциям без ужасов типа BOOST_FOREACH

я и говорю, мелкие доработки вместо своих велосипедов.

К>- std::unique_ptr (нормальных аналогов до выхода C++11 не было)

auto_ptr то же самое кроме move semantics. или я в чем-то неправ? смартпойнтеры были хорошо разжеваны еще Александреску и я использовал его локивские еще году в 2006ом. стандартизовали — молодцы. сделаи чтото новое? да нет кгнечно

К>- избавление от необходимости писать километровые имена типов (auto)

да, согласен. единсвтенная сильная доработка. впрочем, ничего фундаментально не меняющая. просто typedef писать не нужно. я лично auto ипользую в основном только для итераторов.

К>+ по мелочи variadic templates, constexpr, upgrade STL ...

ну да, мелкая хрень всякая

К>Скажу больше,

К>- если человек когда-то писал на C++, но не делает это сейчас
К>- если человек пишет на C++, но не интересуется, не изучал С++11
К>то он не знает современный C++
конечно, не знает. современный С++ такой сложный, что его никто не знает
Отредактировано 19.01.2015 21:48 __kot2 . Предыдущая версия .
Re[13]: Garbage collection vs manual memory management
От: Константин Россия  
Дата: 20.01.15 09:36
Оценка:
Здравствуйте, gandjustas, Вы писали:

К>>Почему костыль? Вполне себе идиома объекта с единственным владельцем.

G>А зачем оно нужно? Единственность владельца важна в двух случаях — автоматическое удаление объекта, передача между потоками. Второе в С++ не реализовано, а первое является костылем для атоматических деструкторов, которые в свою очередь костыли для небезопасных указателей.

IMHO, единственность владельца облегчает понимание кода. Владение и side эффекты связанные с этим локализованы.

<offtopic>
С точки зрения .NET некоторые идиомы C++ могут казаться костылями. Обратное тоже верно. Не вижу смысла особо флеймить по этому поводу.
</offtopic>
Re[14]: Garbage collection vs manual memory management
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.01.15 10:09
Оценка: -1
Здравствуйте, Константин, Вы писали:

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


К>>>Почему костыль? Вполне себе идиома объекта с единственным владельцем.

G>>А зачем оно нужно? Единственность владельца важна в двух случаях — автоматическое удаление объекта, передача между потоками. Второе в С++ не реализовано, а первое является костылем для атоматических деструкторов, которые в свою очередь костыли для небезопасных указателей.

К>IMHO, единственность владельца облегчает понимание кода.

Это облегчает понимание C++ кода, мбо в нем владелец отвечает за овобождение памяти. В языках с GC владение нужно нечасто, только в запутанных графах объектов.

К>Владение и side эффекты связанные с этим локализованы.

Владение в C++ это вовсе не гарантия, можно из unique_ptr получить голый указатель и предать куда угодно.
Фактически единственная суть "владения" в C++ — ответственность за уничтожение.


К><offtopic>

К>С точки зрения .NET некоторые идиомы C++ могут казаться костылями. Обратное тоже верно. Не вижу смысла особо флеймить по этому поводу.
К></offtopic>
Если кажется костылями, то это и есть костыли. Но нужно отдать должное новым версиям C++, там ручное выписывание copy и move ctor почти не нужно если пользуешься правильными средствами. Все костыли надежно спрятаны внутри stl.
В ранних версиях конечно все костыли торчали наружу, что изрядно доставляло.
Re[2]: Garbage collection vs manual memory management
От: vdimas Россия  
Дата: 21.01.15 07:43
Оценка: +1
Здравствуйте, vdimas, Вы писали:

V>Стандартный паттерн для таких сценариев — это приведение отношения использования из oo:1 к 1:1 и нам достаточно будет затем сделать подмену указателя только в одном месте. Делается опять же стандартно через ровно +1 к уровню косвенности...


Прошелся по остальной ветке, такое решение уже предлагали:
http://rsdn.ru/forum/philosophy/5917277
Автор: andyag
Дата: 10.01.15

http://rsdn.ru/forum/philosophy/5916590
Автор: andyag
Дата: 09.01.15
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.