我开始使用cocos2d-x并遇到问题。下面的代码会在s->getChildrenCount();
处引发读取访问冲突错误。
HelloWorldScene.h
class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void update(float) override;
CREATE_FUNC(HelloWorld);
private:
cocos2d::Sprite* s;
};
HelloWorldScene.cpp
Scene* HelloWorld::createScene()
{
auto scene = Scene::create();
auto layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
s = Sprite::create();
this->scheduleUpdate();
return true;
}
void HelloWorld::update(float delta)
{
int k = s->getChildrenCount();
...
}
我的猜测是s
变成了悬空指针,它与引用计数有关。我读了引用计数的工作原理,但我并没有完全理解它。
如何在init
结束时销毁精灵?谁在做呢?
解决此问题的正确方法是什么?在s->retain()
之后Sprite::create()
并在HelloWorldScene
添加s->release()
析构函数?如果我这样做,我看不到使用传统C ++ new
和delete
的好处。
答案 0 :(得分:0)
首先,没有悬空指针,但创建的指针不再存在,s
现在是nullptr
。这就是您尝试访问getChildrenCount()
方法时出现访问冲突错误的原因。
使用create()
方法创建的对象将被评估为在它们创建的方法结束时立即释放。这意味着如果对象没有引用且未标记为要保留,则将解构创建的对象。如果您希望更改此行为,则必须分别调用retain和release,就像您已经完成的那样。
与使用s->retain()
和s->release()
相比,new
和delete
或一般参考计数的好处之一是您不必担心数据你班外的会员资格即。 当您调用delete时,您确定资源不再在任何地方使用吗?通过使用引用计数和保留/释放机制,这个问题变得不必要了。