首页 > 解决方案 > 我有一个将在程序的整个持续时间内实例化的对象,但是一个不会实例化的类成员,我应该动态分配它吗?

问题描述

让我再次提出我的问题:

我有一个 Game 类,它在程序开始时被实例化,并且仅在程序生命周期结束时被销毁。

我的 Game 类中有一个“StartMenu”成员对象,我显然希望在游戏生命周期开始时可用,但在用户开始游戏后应该占用内存。(根本没有理由这样做)。

我当前的解决方案是将 StartMenu 指针声明为成员,通过从构造函数调用的方法(或在必要时在其他地方)动态为其分配内存,然后在用户希望玩游戏时将其删除。这是一个好的实践解决方案吗?是否应该更改设计,或者是否有或更标准的“开始菜单”处理方式?

相关代码:

Class Game 
{
  private:
  StartMenu* startMenu_ptr;

  //Other  Game Vars
}

初始化

Game::initStartMenu() {
  startMenu_ptr = new StartMenu(); 
}

删除

Game::runStartMenu() {

if(startMenu_ptr->getOption()==1) {
  delete startMenu_ptr;
  startMenu_ptr = nullptr;
}
 

编辑:需要更多细节。runStartMenu 在每帧的 while 循环中被调用,以检测更新和用户输入。此外,对 startMenu 的任何更新都会被记录下来,然后在单独的方法 (Game::render()) 中绘制以反映用户输入。我不能在循环的每次迭代中重新初始化 startMenu。

Game::update() (从 main 调用,在事件 while 循环内)

void Game::update() {

switch(gameState)
 {
  case 0:
       runStartMenu();
       break;
  case *n*... //other game screens...
 }
}

然后是我的 draw Game::render() 函数:(从 main 调用,在事件 while 循环内)

Game::render()

  switch(gameState)
   {
    case 0:
       drawStartMenu();
       break;
    case *n*... //other game screens...
   }
  }

谢谢。

标签: c++pointersmemory-managementmenu

解决方案


编辑:根据要求,在菜单运行时允许后台执行其他任务

作为一般规则,您永远不应该在智能指针的上下文之外操作原始new和运算符。delete对于您的用例,您绝对可以使用静态分配,而动态分配不会带来任何优势,所以我建议您以简单的方式设计它,如下所示:

StartMenu::choice_t choice;

Game::runStartMenu() {
    auto menuThread = std::thread([](){
        auto menu = StartMenu{/* options */};
        // for example :
        choice = menu.show(); 
    }); // the menu memory gets freed here 

    
    menuThread.join(); // wait for execution end

    // choice handling logic
} 

然后,调用者可以实现菜单选择逻辑并开始游戏!


推荐阅读