是否可以使用带有节点用户数据的c ++ 11智能指针?以前有人试过吗?
node->setUserData(void* usrData);
node->getUserData();
解决:
我想出了一种在Node中存储对象的方法,而无需手动删除主题(在Node被销毁时自动删除),它可能不是最佳解决方案,但它仍然是一个解决方案,它涉及继承自 cocos2d :: Ref 类并使用节点 setUserObject(Ref * ptr)!
这就是我实现它的方式:
1) - 创建一个继承自cocos2d :: Ref class。
的类/结构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
现在,只要销毁了Layer / Node(不需要删除),就会自动销毁box对象
PS:您应该正确退出cocos2d-x应用程序,以便调用节点(Node,Layer,Scene)析构函数,以便节点子节点被正确销毁(子节点析构函数被调用)...只需按下背面如果您在模拟器中使用按钮或使用调用Director :: end()的关闭按钮。
答案 0 :(得分:0)
这是一个评论,但是太长了。
我不认为它像@Joachim Pileborg在评论中所做的那样毫无希望(尽管他的观点在原则上是正确的)。你唯一要假设的是setUserData
只是观察,即它不执行与记忆相关的动作,特别是没有delete
。
然后您可以简单地使用智能指针“外部”,
auto ptr = std::make_unique<some_object>();
node->setUserData(ptr.get());
现在,如果程序以适当的方式退出,至少您不必手动删除ptr
。但是,正如Joachim所提到的,当然{}}}必须确保ptr
存在,只要它可以在node
内使用。
或者,您可以在node
类周围编写一个小包装器,其中包含shared_ptr<void> ptr
变量,并提供setUserData(shared_ptr<void>)
方法。如果调用此方法,它首先复制共享指针并在内部调用node->setUserData(ptr.get())
方法。然后保证底层物体保持活力。