为什么不删除cocosd2d-x中的最后一个场景触发场景析构函数?

时间:2014-03-06 11:55:04

标签: c++ memory-management cocos2d-x

我在cocos2d-x v.2.2.2中为Player* _player场景添加了HelloWorldScene指针。我已经定义了class Player : public cocos2d::Object,因此引用了它。我HelloWorldScene的创建方法如下所示

Scene* HelloWorldScene::createScene(Player* player)
{
  auto scene = Scene::create();
  auto layer = HelloWorldScene::create();
  layer->_player = player;
  player->retain();
  scene->addChild(layer);
  return scene;
}

其中playerAppDelegate::applicationDidFinishLaunching()中实例化。现在,既然我保留了_player(今天我感觉自己像个好人),我也决定发布它:

HelloWorldScene::~HelloWorldScene()
{
  if (_player)
  {
    _player->release();
  }
}

到目前为止一切顺利。但是,当弹出HelloWorldScene时,会调用以下内容

void Director::popScene(void)
{
  CCASSERT(_runningScene != nullptr, "running scene should not null");

  _scenesStack.popBack();
  ssize_t c = _scenesStack.size();

  if (c == 0)
  {
    end();
  }
  else
  {
    _sendCleanupToScene = true;
    _nextScene = _scenesStack.at(c - 1);
  }
}

那么,只要HelloWorldScene是堆栈中的最后一个场景,它就不会被破坏? (至少从XCode看起来就是这样。)

我不是C ++的大师,所以请原谅我的无知。然而,对我来说,这是一个非常意想不到的行为。在程序终止之前不应该清除弹出的场景(通过让_sendCleanupToScene = true让它再运行一次)?

显然,我错过了一些东西......如果有人能够对此有所了解,我会很激动! :)

1 个答案:

答案 0 :(得分:0)

所以我的问题的前提是错误的 - 我不知何故认为一切都必须在程序终止时释放。但是,正如我昨天重新学习的那样,操作系统当然会在程序终止后回收已分配的内存。因此,不必在堆栈中释放最后一个场景。