我開始使用cocos2d-x,並遇到問題。下面的代碼在s->getChildrenCount();
處拋出讀取訪問衝突錯誤。Sprite :: create()後懸掛Sprite指針成員變量
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
成爲懸擺指針,它有事情做參考計數。我讀了如何引用計數的作品,但我沒有完全理解它。
sprite在init
的末尾如何被破壞?誰在做?
解決此問題的正確方法是什麼?在Sprite::create()
之後執行s->retain()
並添加析構函數與s->release()
?如果我這樣做,我看不到使用傳統C++ new
和delete
的好處。
你是對的,我犯了一個錯誤 - 這是一個空指針,而不是一個懸掛指針。 「使用create()方法創建的對象只要創建方法結束,就會被評估爲被釋放。」 - 這在C++中如何實現? – takfuruya
這是一個很好的問題,但不容易在評論中回答。嘗試搜索C++引用計數和智能指針。 –