У меня такая ситуация: есть класс GraphicsContext:
class GraphicsContext {
...
private:
std::unique_ptr<Renderer> m_renderer;
}
И есть класс приложения, которое использует GraphicsContext:
class Application {
...
private:
std::unique_ptr<GraphicsContext> m_graphicsContext;
}
И есть классы подуровня, которые используются в классе Application и которые используют Renderer из GraphicsContext. Мне нужно сохранить указатель на средство визуализации в этих классах, но как мне это сделать?
class SubLevelClass {
public:
SubLevelClass(Renderer* renderer);
...
void drawSomething();
private:
Renderer* m_renderer; // this class is not owner of Renderer but should can ability to refer to it
}
Такие классы подуровня семантически не владеют средством визуализации, и поэтому я думаю, что использовать shared_ptr вместо unique_ptr - не лучшая идея. Но как организовать такое владение, если гарантировано, что объекты подуровневых классов живут меньше времени, чем объект Application? Могу ли я сохранить и вернуть из GraphicsContext необработанный указатель на Renderer или это семантически неправильная идея?
SubLevelClass
когда-либо отвечал заdelete
обработку рендерера? Насколько я понимаю, нет, этого никогда не было. Так что с необработанным указателем все в порядке, вы не несете ответственности за его время жизни. Тот, кто несет ответственность, будет обладать умным указателем, напримерstd::unique_ptr<Renderer>
. Если ответственность может быть несколько, значит, у вас совместное владение и вы используетеshared_ptr
. Похоже, чтоRenderer
вообще не связан с очисткой, поэтому не связан с владением. Но, возможно, я неправильно понял ваш вопрос. - person François Andrieux   schedule 23.08.2019SubLevelClass
не несет ответственности заdelete
обработку рендерера. Я имею в виду ситуацию, когда GraphicsContext решаетdelete
использовать рендерер до того, как он будет использован вSubLevelClass
. В этом случае мы получим использование уже освобожденного указателя. - person Nikolai Paukov   schedule 23.08.2019Renderer* m_renderer;
не является висящим указателем, вы можете использовать assertion. Всякий раз, когда экземплярRenderer
удаляется - проверьте, есть ли ещеSubLevelClass
его сохранить. Для отслеживания требуется некоторая дополнительная структура данных (например, карта). - person javaLover   schedule 24.08.2019SubLevelClasses
об удаленииRenderer
экземпляра? И я сомневаюсь в применимости утверждений, потому что в C ++ я не могу проверить достоверность необработанного указателя во время выполнения. Я могу только проверить его на ненулевое значение, но в данном случае этого недостаточно. - person Nikolai Paukov   schedule 25.08.2019