C++ 在Sprite::create()之后悬空的Sprite指针成员变量
我刚开始使用cocos2d-x,我遇到了一个问题。下面的代码在C++ 在Sprite::create()之后悬空的Sprite指针成员变量,c++,cocos2d-x,C++,Cocos2d X,我刚开始使用cocos2d-x,我遇到了一个问题。下面的代码在s->getChildrenCount()处抛出读取访问冲突错误 HelloWorld场景 class HelloWorld : public cocos2d::Layer { public: static cocos2d::Scene* createScene(); virtual bool init(); void update(float) override; CREATE_FUNC(HelloW
s->getChildrenCount()处抛出读取访问冲突错误代码>
HelloWorld场景
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
结束时被销毁?谁在做这件事
解决这个问题的正确方法是什么?在Sprite::create()
之后执行s->retain()
,并使用s->release()添加HelloWorldScene
析构函数?如果我这样做,我看不到使用传统C++ <代码>新< /COD>和<代码>删除< /COD> .< /P> < P>首先,没有悬空指针,但是创建的指针不再存在,<代码> S/COD>现在是<代码> nulLPTR < /C>。这就是为什么在尝试访问getChildrenCount()
方法时会出现访问冲突错误
使用create()
方法创建的对象将在创建它们的方法结束后立即被释放。这意味着,如果对象没有引用且未标记为保留,则创建的对象将被解构。如果您想改变这种行为,必须分别调用retain和release,就像您已经得出的结论一样
与使用new
和delete
相比,s->retain()?通过使用引用计数和保留/释放机制,这个问题变得不必要了。首先,没有悬空指针,但创建的指针不再存在,s
现在是nullptr
。这就是为什么在尝试访问getChildrenCount()
方法时会出现访问冲突错误
使用create()
方法创建的对象将在创建它们的方法结束后立即被释放。这意味着,如果对象没有引用且未标记为保留,则创建的对象将被解构。如果您想改变这种行为,必须分别调用retain和release,就像您已经得出的结论一样
与使用new
和delete
相比,s->retain()?通过使用引用计数和保留/释放机制,这个问题变得不必要了。你是对的,我犯了一个错误-这是一个空指针,而不是一个悬空指针。“使用CeaTye()方法创建的对象将在创建完的方法中被评估为释放。”——C++中这是怎么可能的?这是一个好问题,但在注释中不容易回答。试着搜索C++引用计数和智能指针。你说得对,我犯了一个错误——这是一个空指针,而不是一个悬空指针。“使用CeaTye()方法创建的对象将在创建完的方法中被评估为释放。”——C++中这是怎么可能的?这是一个好问题,但在注释中不容易回答。尝试搜索C++引用计数和智能指针。