Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Sprite::create()之后悬空的Sprite指针成员变量_C++_Cocos2d X - Fatal编程技术网

C++ 在Sprite::create()之后悬空的Sprite指针成员变量

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

我刚开始使用cocos2d-x,我遇到了一个问题。下面的代码在
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++引用计数和智能指针。