【发布时间】:2016-06-30 15:00:43
【问题描述】:
是否可以将 c++11 智能指针与节点用户数据一起使用?有人试过吗?
node->setUserData(void* usrData);
node->getUserData();
已解决:
我想出了一种在节点中存储对象而不必手动删除主题的方法(当节点被销毁时会自动删除),它可能不是最好的解决方案,但它仍然是一个解决方案,它涉及从 cocos2d::Ref 类和使用节点 setUserObject(Ref* ptr)!
这就是我实现它的方式:
1)- 创建一个继承自 cocos2d::Ref 类的类/结构。
2)- 用您的自定义属性和方法填充它。
3)- 确保对象调用 autorelease()。
struct Box : public cocos2d::Ref
{
// some properties here
Box() {
//autorelease means let other Nodes retain and release this object.
//if you don't call autorelease then the object destructor won't get called which means in turn object memory is not released.
this->autorelease();
}
~Box() {
//just to check if the object destructor is called or not.
log("=========================");
log("Box is destroyed");
log("=========================");
}
};
4)- 创建一个对象实例并将其指针放在任何 Node UserObject 中,如下所示:
auto box = new Box;
this->setUserObject(box);// am putting it in the Layer UserObject
现在只要层/节点被销毁,盒子对象就会自动销毁(不需要删除)
PS:您应该正确退出 cocos2d-x 应用程序,以便调用节点(节点,层,场景)析构函数,以便正确销毁节点子节点(调用子析构函数)...只需按回按钮,如果您在模拟器中或使用调用 Director::end() 的关闭按钮。
【问题讨论】:
-
如果函数没有声明为采用智能指针,那么不是真的。您可以使用智能指针,然后将实际指针传递给函数,但是如果智能指针决定删除包含指针,它确实违背了使用智能指针开始的全部要点(双关语不是有意的)。
-
所以即使我将 shared_ptr::get() 方法与 setUserData ...即使一个节点用户数据持有它?
-
如果你使用例如
some_share_ptr.get()获取原始指针,共享指针如何能够跟踪原始指针?它只是不能,所以当所有共享指针超出范围时,指针将被删除,留下一个流浪指针。 -
但是如果我使用 setUserData(&some_share_ptr) 会被删除吗?
-
这并不比使用来自共享指针对象的原始指针更好。使用指向共享指针对象的指针不会修改共享指针对象引用计数器,它用于跟踪共享指针对象。
标签: c++ c++11 cocos2d-x cocos2d-x-3.0