【发布时间】:2018-11-07 17:07:06
【问题描述】:
基本上,我有一个包含要在类之间共享的对象的结构体,如下所示;
struct CoreComponents
{
std::unique_ptr<a> m_A = std::make_unique<a>();
std::unique_ptr<b> m_B;
std::unique_ptr<c> m_C = std::make_unique<c>();
};
在我的主课中,我通过 unique_ptr 拥有它;
class Game
{
...
private:
std::unique_ptr<CoreComponents> m_Components;
...
};
然后我有其他 n 类,我需要从它的函数访问该 m_Components 对象而不创建副本。 (我不会修改那个对象的内容)
我尝试使用 shared_ptr 在 Game 类中保存 m_Components 然后通过它通过值传递给其他类(传递给它们的构造函数)并将其存储,但这种情况会导致内存泄漏。 (我使用 memcheck 来检查泄漏)我发现这是泄漏的原因,但我无法弄清楚究竟是为什么。
Shared_ptr 场景
我需要访问 CoreComponents 对象的类的构造函数;
GameScene::GameScene(std::shared_ptr<CoreComponents> components)
: m_Components(std::move(components))
我试图将它作为 GameScene 类的成员,然后在函数中使用它;
std::shared_ptr<CoreComponents> m_Components;
这就是我从 Game 类内部传递它的方式;
auto gs = std::make_unique<GameScene>(m_Components)
GameScene 类中的一般用法;
m_Components->m_A->draw(*m_OtherObjectInsideGameScene);
那么,使用现代 c++ 创建类似设计的最佳方法是什么? 我试图避免 Singleton 模式,但我必须使用它来实现这一点,还是可以更好地使用智能指针?
PS:当 Game 类被销毁时,CoreComponents 结构体需要从内存中删除。
【问题讨论】:
-
如果您遇到代码无法正常工作的问题,请发布该代码 - 即使用共享指针的代码。
-
@NeilButterworth 感谢您的反馈。添加了关于共享指针场景的代码。
-
记住,
std::weak_ptr是一个东西。
标签: c++ oop smart-pointers