Умные указатели обрабатывают литье, а если нет, то безопасный способ обойти это ограничение?Как следует использовать умные указатели?
Пример того, что я пытаюсь сделать, это наличие двух векторов STL (например), содержащих интеллектуальные указатели. Первый содержит интеллектуальные указатели на базовый класс, а второй содержит интеллектуальные указатели на производный класс. Смарт-указатели ссылаются на подсчет, например. аналогичное поведение с shared_ptrs Boost, но ручная работа. Я включил некоторые примеры кода, которые я взбитыми привести пример:
vector<CBaseSmartPtr> vecBase;
vector<CDerivedSmartPtr> vecDer;
...
CBaseSmartPtr first = vecBase.front();
vecDer.push_back(CDerivedSmartPtr(dynamic_cast<CDerived*>(first.get()));
Это кажется не безопасной для меня, как я думаю, что я в конечном итоге с двумя смарт-указатели управления один и тот же объект. В какой-то момент вниз по дорожке это, вероятно, приведет к тому, что один из них освободит объект, в то время как другой все еще содержит ссылки на него.
Что бы я надеялся, но не думаю, что это сработает, это прямой литой при сохранении того же объекта, например.
dynamic_cast<CDerivedSmartPtr>(first)
Должен ли я смотреть, чтобы изменить второй контейнер также использовать CBaseSmartPtr и опущенными только на использование? Существуют ли другие решения?
Почему вы сделать свой собственный? – GManNickG
Я думаю, что это интересный вопрос, потому что он попадает во внутренние реализации интеллектуальных указателей. Но я также хотел бы отметить, что создание downcasting в вашей стратегии подразумевает недостаток дизайна, IMHO. –
Чтобы ответить, почему я делаю свой собственный, это устаревший код и вырвать текущее использование и заменить его на Boost, было бы довольно большим изменением. Это в моем списке «будущих вещей, чтобы посмотреть». – dlanod