You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

栈上局部对象离开作用域后,为何game类的vector仍保留对象?

问题解答:栈上局部对象入容器后为何未被销毁?

问题背景及代码

类定义

class game
{
private:
    vector<stack> stacks_;
public:
    game();
    void solve();

   friend ostream& operator<<(ostream& os,const game& game);
};

构造函数实现

game::game()
{
    for (int i = 0; i < 3; i++)
    {
        stack s;
        stacks_.push_back(s);
    }
    cube blueCube(4,0);
    stacks_[0].push(blueCube);

    cube yellowCube(3,1);
    stacks_[0].push(yellowCube);

    cube redCube(2,2);
    stacks_[0].push(redCube);

    cube blackCube(1,2);
    stacks_[0].push(blackCube);
}

主函数代码

int main()
{
  game g;

  cout<<g<<endl;

}

用户疑问

创建game类对象后,其内部的vector为何仍保留对象?我原本以为像cube blueCube(4,0);这种未用new创建的栈上局部对象,在离开构造函数作用域后会被销毁,但实际并非如此,恳请解释原因。

核心原因解释

  • 你混淆了局部对象本身和容器中存储的副本:构造函数里的blueCube这类栈上局部对象,确实会在构造函数执行完离开作用域时被销毁,但stacks_[0].push(blueCube)这一步,是把blueCube的副本压入了栈容器中。
  • vector和stack这类C++标准容器,默认存储的都是对象的副本(除非你特意存储指针或引用类型)。当你调用push方法时,容器会在自己管理的内存空间(通常是堆内存)里创建一个新的cube对象,把局部对象的内容完整复制过去。
  • 所以构造函数结束后,原来的栈上局部cube对象被销毁,但容器里的副本依然保存在game类的stacks_成员中,自然能在主函数中通过cout输出显示。

举个简化的例子辅助理解:

// 栈上的局部对象,作用域仅限于当前代码块
cube temp(1, 0);
// 容器存储的是temp的副本,不是temp本身
my_stack.push(temp);
// 离开代码块后temp被销毁,但my_stack里的副本不受任何影响

内容的提问来源于stack exchange,提问作者Sor3a

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:20:39