首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >似乎无法理解c++ shared_ptr和指向其表示对象的可靠指针

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

Stack Overflow用户
提问于 2014-12-08 20:33:24
回答 2查看 253关注 0票数 0

我是一个c++新手,正在尝试使用游戏引擎框架minko。Minko过度使用shared_ptr,我对它们的确切工作原理有疑问,因为它们似乎脱离了一般的c++ *ptr逻辑。

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

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

让我们从对象开始。

代码语言:javascript
复制
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文档中没有找到任何对此的引用,所以我假设这一定是游戏引擎所特有的。

现在我有了我的Game类:

代码语言:javascript
复制
class Game
{
    minko::Canvas::Ptr _canvas;
    minko::scene::Node _root;
    minko::component::SceneManager _sceneManager;
}

在同一函数中的某个地方,上面的对象被创建,赋值:

代码语言:javascript
复制
_canvas = canvas;
_root = root;
_sceneManager = sceneManager;

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

代码语言:javascript
复制
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++专家经验。

EN

回答 2

Stack Overflow用户

发布于 2014-12-08 20:38:47

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

我不熟悉这个库,但我猜您想要使用它们的Ptr typedefs (它是适当的共享指针类型的别名),就像您已经对_canvas所做的那样。

代码语言:javascript
复制
class Game
{
    minko::Canvas::Ptr _canvas;
    minko::scene::Node::Ptr _root;
    minko::component::SceneManager::Ptr _sceneManager;
}
票数 3
EN

Stack Overflow用户

发布于 2014-12-08 20:35:58

通过printf()语句使用std::shared_ptr::get()函数访问托管对象指针。

代码语言:javascript
复制
printf("MEMTEST: canvas: %p vs %p , root: %p vs %p , scenemgr: %p vs %p\n"
      , _canvas.get(), canvas.get()
      , _root.get(), root.get()
      , _sceneManager.get(), sceneManager.get());
printf("MEMTEST: canvas: %X vs %X , root: %X vs %X , scenemgr: %X vs %X\n"
      , _canvas.get(), canvas.get()
      , _root.get(), root.get()
      , _sceneManager.get(), sceneManager.get());

就其本身而言,它们对于比较shared_ptr<>实例中的任何内容来说都是非常无用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27358129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档