Как стать автором
Обновить

Комментарии 8

Сырые указатели… Я бы, пожалуй, хранил бы по значению в каком-нить векторе, для представления сортированного списка использовал бы подход "container of references": http://www.cplusplus.com/reference/functional/reference_wrapper. Да, по сути будет две коллекции: одна хранит данные, а вторая позволяет изменять их представление: сортировка, фильтрация и т.п. Плюс данные хранятся максимально монолитным блоком.


Хотя… Для такой структуры можно было бы посмотреть на хранение вообще по значению и заниматься оптимизациями когда это реально потребуется. Если потребуется.

А чем вам сырые указатели не угодили? Я заметил их только в передаче в функцию объектов Player (ну и char*). А если у объекта единственный owner и вы не передаете ownership в функцию, то вы не то что можете, вы обязаны передать сырой указатель/ссылку в эту функцию. Где-то у Herb Sutter табличка была про это.

Да. Это еще отмечено C++ Core Guidelines. Возможно monah_tuk не нравится писать отдельный метод освобождения памяти.

Скорее это. Особенно когда контейнер нужно часто модифицировать.

Это абстрактная задачка, которую придумал для демонстрации.

Это понятно. Просто триггер сработал. Я уже не раз сталкивался с косяками связанными с хранением сырых указателей в контейнерах, а потом: забыли удалить, удалили в другом месте, удалили, а в контейнере оставили. А на всяких RTOS второе и третье ещё и не сразу выстрелить может.


Поэтому руководствуюсь простым правилом (и коллегам его продвигаю): можно обойтись без сырого указателя — обходись. Ссылки, набор умных указателей, контейнеры — инструментов для этого много в современном стандарте. Пока не подводило.

Меня не передача озадачила, а хранение в m_players. По сути, там можно вполне себе хранить std::unique_ptr<Player>. Плюс эти же указатели передаются в m_id2player и потом через него же уничтожаются в freeMemPlayers(), при этом, внимание, не очищая их в m_players, я понимаю, что функция вызывается в текущем виде только из деструктора, который, в данный момент, вызывается только при остановке приложения, но, как мне кажется, тут как раз передача владения по сырому указателю. Да и собственно не понятно, где владелец: m_players или m_id2player.


Ну и вот моё предложение по этому моменту: https://github.com/RPG-18/SimpleMicroservice/pull/1

Спасибо принял.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории