栈上局部对象离开作用域后,为何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
相关产品推荐
相关产品推荐

