yigal_s: (Default)
[personal profile] yigal_s
Мудацкий С++ всегда забавен (особенно если хороошо забыть то, что знал когда-то).

Сто тридцать пятая попытка сделать смарт-поинтеры, в этот раз shared_ptr, которому, впрочем, сто лет в обед. Недостатки:

1. member-функция всё ещё имеет дело с raw-pointer 'this'. Хоть убейся. Т.е. о 100% безопасности кода речи и не идёт, всегда можно ненароком куда-то засунуть обычный указатель.

2. shared_ptr на тип не совместим с shared_ptr на константный тип или на базовый тип. Ну, т.е. прокастировать-то можно, но при этом будет зачем-то создаваться новый объект указателя. Боюсь, в рамках С++ это в случае наследования и решить нельзя, не выходя грубо за рамки стандарта. Остаётся только тупо копировать shared_ptr, что не очень дорого, но... жаба душит.

3. Если объект где-то расшерен, а у вас есть обычный указатель, то сделать из него снова shared ведёт к катастрофе. Ну, если такое действительно нужно, то можно как-то исхитриться, написать функцию-член класса give-me-shared(), которая воспользуется внутря shared_from_this. Ну всё же от тупого повторного вызова конструктора shared_ptr поверх указателя - как защититься? Конструктор-то публичный, производящий shared_ptr из обычного указателя - он, пусть и explicit, но всё равно открыт всем семи ветрам, поди потом по коду отследи где его вызывали.

4. shared_from_this из конструктора ведёт к undefined behavior (вроде в С++17 убрали). Как его не вызывать из конструктора - шерифа не волнует.

Культура отсутствия критики предусматривает, что подобную информацию вы можете насобирать по разным книгам или форумам, но никак не в централизованном виде на страницах документации. Everything is awesome.

ПС: а если поизвращаться, то во время компиляции хорошо б проверить, что указатели на базовый и производный класс совпадают по значению, и что размер shared_ptr совпадает для базового и производного класса (жалкая попытка убедиться в binary-compatibility), после всего для всех таких случаев сгенерить оператор кастирования в референс на smart_ptr на базовый тип...

Date: 2018-11-29 08:28 pm (UTC)
brmail: (Default)
From: [personal profile] brmail
ну а фигли, с течением времени с++ как бы перестал быть языком высокого уровня, поэтому, господа программисты сами смотрите чего вы там вызываете и вообще что у вас наворочено. Хочется безопасного кодирования переползайте на еще более у*бищную джаву или там на c#