Обрабатывают ли интеллектуальные указатели приведение вниз, и если нет, то как безопасно обойти это ограничение?
Примером того, что я пытаюсь сделать, является наличие двух векторов 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 и понижал только использование? Есть ли другие решения?
shared_ptr
. Ууу, это проблема, когда два интеллектуальных указателя совместно владеют правами собственности? - person MSalters   schedule 02.09.2009first.get()
может означать, что они не знают, что должны делиться. - person sbi   schedule 02.09.2009