c++ - 似乎无法理解 c++ shared_ptr 和指向其代表对象的可靠指针

标签 c++ pointers shared-ptr minko

我是一名 C++ 新手,正在尝试使用游戏引擎框架 minko。 Minko 过度使用 shared_ptr 并且我无法理解它们究竟是如何工作的,因为它们似乎逃避了一般的 c++ *ptr 逻辑。

在初始化阶段的某处,通过其成员函数创建并获取了几个对象,例如canvas、sceneManager和rootNode对象。 我试图将它们全部绑定(bind)在一个 Game 类中,除了一些游戏逻辑外,该类应该包含指向每个重要引擎对象的指针。

我遇到了这个问题,我最初尝试使它工作的结果是重复的对象,因为函数调用不起作用,什么也没发生。经过一些调试后,我在指针赋值后添加了 printf 函数,以查看它们实际指向的位置以及它们指向不同的内存地址,这让我想知道它们是否真的被进程复制了,或者发生了其他一些神秘的魔法。

让我们从对象开始。

std::shared_ptr<minko::Canvas> canvas = Canvas::create("RenderTarget", 1280, 1024);
std::shared_ptr<minko::component::SceneManager> sceneManager = SceneManager::create(canvas->context());
std::shared_ptr<minko::scene::Node> root = scene::Node::create("root")
    ->addComponent(sceneManager);

那些对象中的每一个都包含一个::Ptr 成员属性,它似乎直接包含指针。我没有在 shared_ptr 文档中找到任何对此的引用,所以我认为这一定是特定于游戏引擎的。

现在我有了我的游戏类:

class Game
{
    minko::Canvas::Ptr _canvas;
    minko::scene::Node _root;
    minko::component::SceneManager _sceneManager;
}

在创建上述对象的同一函数中的某处,赋值:

_canvas = canvas;
_root = root;
_sceneManager = sceneManager;

我在每个变量前后尝试了不同种类的 * 和 &,尝试了指针、直接值、指针指针的各种组合,但每次我都进行了两次调试调用:

printf("MEMTEST: canvas: %p vs %p , root: %p vs %p , scenemgr: %p vs %p\n", _canvas, canvas, _root, root, _sceneManager, sceneManager);
printf("MEMTEST: canvas: %X vs %X , root: %X vs %X , scenemgr: %X vs %X\n", _canvas, canvas, _root, root, _sceneManager, sceneManager);

内存值不同,让我相信它们不指向同一个对象。

现在,我该去哪里?文档并没有真正帮助我,只是大量的东西我还没有完全理解,而且我发现的所有这些网站似乎确实需要大量我还不具备的 c++ 知识。必须有一种更简单的方法来理解这一点,而不必积累 5 年以上的 C++ 经验。

最佳答案

_root_sceneManager 被声明为对象,而不是指针。它们永远不会引用您使用 create 函数创建的相同对象。

我不熟悉这个库,但我猜你想使用它们的 Ptr typedef(它是适当的共享指针类型的别名),就像你已经为 做的一样_ Canvas

class Game
{
    minko::Canvas::Ptr _canvas;
    minko::scene::Node::Ptr _root;
    minko::component::SceneManager::Ptr _sceneManager;
}

关于c++ - 似乎无法理解 c++ shared_ptr 和指向其代表对象的可靠指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27358129/

相关文章:

c++ - 指向静态常量对象的共享指针?

c++ - 错误 2664 - 无法从 std::vector<...> 转换为 std::tr1::shared_ptr

c# - Xna (C#) 和 C++ 的网络?

c - 为什么这个程序会出现段错误?

ios - 将信息从 Parse 中的用户指针添加到数组 - Swift

C 前向引用结构 - 1) 必须带有指针? 2)必须初始化?

c++ - 关于shared_from_this()实际使用的问题

c++ - 如果未使用的函数参数是指向函数的指针,是否需要为其实际参数定义?

C++ 编译器标志忽略外部库的警告但不包含目录

C++:作为条件语句的逻辑比较?