【发布时间】:2019-12-29 01:00:38
【问题描述】:
我有以下情况:有GraphicsContext类:
class GraphicsContext {
...
private:
std::unique_ptr<Renderer> m_renderer;
}
还有一类应用使用了GraphicsContext:
class Application {
...
private:
std::unique_ptr<GraphicsContext> m_graphicsContext;
}
还有一些在 Application 类中使用的子级类和使用 GraphicsContext 中的 Renderer 的子级类。我需要在这些类中存储指向渲染器的指针,但我应该怎么做呢?
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 的原始指针还是语义错误的想法?
【问题讨论】:
-
如果没有所有权问题,可以使用原始指针。
-
François,但是与在这种情况下使用共享指针相比,它不会导致内存泄漏的可能性吗?
-
SubLevelClass曾经负责delete渲染器吗?我的理解是,不,从来都不是。所以一个原始指针很好,你不对它的生命周期负责。 负责的人将拥有像std::unique_ptr<Renderer>这样的智能指针。如果可能有多个对象负责,则您拥有共享所有权并在那里使用shared_ptr。看起来Renderer根本不涉及清理,因此不涉及所有权。但也许我误解了你的问题。 -
SubLevelClass不负责delete渲染器。我的意思是当 GraphicsContext 决定delete渲染器之前它会在SubLevelClass中使用时的情况。在这种情况下,我们将使用已经释放的指针。
标签: c++ pointers memory-management raii ownership-semantics