Здравствуйте, gandjustas, Вы писали:
V>>>>Считается наоборот. Код с дырами в безопасности не может быть оптимальным.
G>>>Не понял о чем ты. Представь типичную программу на C++ до C++11, теперь прикинь сколько и где надо добавить проверок в рантайме, чтобы исключить обращения к освобожденной памяти?
V>>А что изменилось после C++11 в этом плане?
G>После C++ умные указатели вошли в стандарт
Там где требовалось их и так использовали. Стандартизировали лишь существующую практику, и то отчасти.
Самое существенное изменение C++11 относительно умных указателей это move семантика. Она конечно эмулировалась и в предыдущей версии стандарта, но с ограничениями.
G>и стали основным способом работы.
Основным способом работы с чем?
G>Это, кстати, позволяет намного сократить количество ошибок, но путем повышения тормозов. Если писать по старинке, через голые указатели, то очень много ошибок обращений к освобожденной памяти возникает, и довольно часто возникают утечки.
Что значит "по старинке"? По какой именно старинке?
И кстати голые не владеющие указатели прекрасно уживаются с умными.
G>Это тебя в сторону унесло. Не нужны произвольные гарантии, их компилятор не обеспечит. Нужны базовые гарантии безопасности — отсутствие обращений к освобожденным объектам, отсутствие обращений к неинициализированной памяти, запрет реинтерпретации памяти. C++ с голыми указателями этого не дает. А совсем без голых указателей — привет тормоза и счетчиками ссылок.
Это типичное заблуждение Java/C# программиста, мол там где у него new и владеющие указатели, то в C++ обязательно будет какой-нибудь умный/обычный указатель. Этот феномен даже Страуструп высмеивал —
https://youtu.be/OB-bdWKwXsU?t=1984
По факту же в большинстве кода не нужны никакие владеющие указатели.