Re[5]: Похоже, починил.
От: Sheridan Россия  
Дата: 20.12.18 22:55
Оценка: -1
Здравствуйте, rg45, Вы писали:

S>>С каких пор инкапсуляция стала "умным указателем"? Подсчёт ссылок мне не нужен, потому что у меня указателей ровно один (на каждый нужный тип), и он либо указатель, либо nullptr

R>Просто инкапсуляция, конечно, нет. А вот для того, чтобы обеспечить совместное владение объектом ПРАВИЛЬНО, у тебя нет другого выхода, кроме как продублировать всю люгику работы умного указателя в каждом своем классе.
У меня совместное владение ровно одно пока что на проект и там всё ровно.

S>>А урхопрограммеры даже не удосужились проверять на nullptr.

R>А как они могут проверить, что ты обнулил где-то там какой-то свой указатель?
if(!rawptr) { /*оппа, указателя больше нет!*/ }


R>Но у тебя иная ситуация — ты создал объект и в какой-то момент передаешь его в библиотечную функцию (на отрисовку, например). Библиотека сразу же захватывает владение этим объектом при помощи умного указателя (увеличивает счетчит ссылок). А по окончании работы освобождает объект от владения, уменьшает счетчик ссылок и, при достиженни счетчиком нуля грохает объект. Ты ведь счетчик ссылок не нарастил, поэтому про твое владение объектом никто ничего не знает.

Понимаеш ли, у них есть специальный SharedPtr и они всегда явно создают объект с ним например так
SharedPtr<Node> node = scene->createChild();


И чтобы догадаться что
Node *node = scene->createChild();

не совсем и указатель нормальный, а половина умного, то нужно ну я не знаю, телепатом быть, чтоли. Или сорцы библиотеки сначала почитать.

Нормальный человек смотрит на код в первом примере и думает "А, ну тут шаред. Чтобы получить обычный указатель, нужно просто без шаред обёртки" и бинго, креш на ровном месте.
Вот как так можно было написать, а? Хотите шаред сделать — да магистры с вам, делайте. Но нафига в шаред реализовывать первую часть и в остальных объектах вторую часть умных указателей блин?
Matrix has you...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.