如何将智能指针与 setUserData(void*) 一起使用
How to use smart pointers with setUserData(void*)?
是否可以将 C++11 智能指针与节点用户数据一起使用? 以前有人尝试过吗?
node->setUserData(void* usrData);
node->getUserData();
解决:
我想出了一种将对象存储在节点中而无需手动删除主题的方法(当节点被销毁时会自动删除),它可能不是最好的解决方案,但它仍然是一个解决方案,它涉及从 cocos2d::Ref 类继承并使用节点 setUserObject(Ref* ptr)!
这就是我实现它的方式:
1)- 创建一个继承自 cocos2d::Ref 类的类/结构。
2)- 用您的自定义属性和方法填充它。
3)- 确保对象调用自动发布()。
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)- 创建一个对象实例并将其指针放在任何节点用户对象中,如下所示:
auto box = new Box;
this->setUserObject(box);// am putting it in the Layer UserObject
现在,每当层/节点被销毁时,Box 对象将被自动销毁(无需删除)
PS:您应该正确退出 cocos2d-x 应用程序,以便调用节点(节点、图层、场景)析构函数,以便正确破坏节点子节点(调用子析构函数)...如果您在模拟器中,只需按后退按钮或使用调用 Director::end() 的关闭按钮。
这是一个评论,但太长了。
我不会像@Joachim Pileborg在评论中所做的那样绝望(尽管他的观点原则上是正确的)。您唯一需要假设的是setUserData
只是观察,即它不执行与内存相关的操作,尤其是不执行delete
。
然后,您可以简单地使用"外部"的智能指针,
auto ptr = std::make_unique<some_object>();
node->setUserData(ptr.get());
现在,如果程序以正确的方式退出,至少您不必手动删除ptr
。但是,正如约阿希姆所提到的,当然你必须确保ptr
存在的时间,只要它可能在node
中使用。
或者,您可以围绕包含shared_ptr<void> ptr
变量并提供setUserData(shared_ptr<void>)
方法的 node
类编写小包装器。如果调用此方法,它将首先复制共享指针并在内部调用node->setUserData(ptr.get())
方法。然后保证底层对象保持活动状态。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 奇怪的结构&GCC&clang(void*返回类型)
- 无效地将 void 表达式与队列和 .pop() 一起使用
- 需要帮助使 VOID 代码与总工资一起工作
- 是否将invoke_result与void参数类型一起使用
- 为什么 void 以这种方式与内联函数一起使用
- 如何将智能指针与 setUserData(void*) 一起使用
- 将shared_ptr与从void*中定义的对象一起使用
- 无效地将void表达式与线程和对象一起使用
- 将 std::unique_ptr<void> 与自定义删除器一起使用作为智能无效*
- void如何与类型别名一起工作
- 你会如何将亚历山德雷斯库的预期与<T> void 函数一起使用?