【问题标题】:Heap or stack for creating objects? [closed]用于创建对象的堆或堆栈? [关闭]
【发布时间】:2020-04-09 22:28:54
【问题描述】:

我有这个程序,它创建“计算机组件”并将其存储在向量中并将对象写入文件。 如果我在堆栈上创建对象并将内存地址传递给向量,则会出现错误 如果我在堆上创建对象并将指针传递给向量它就可以正常工作“组件是抽象基类”和“CPU 是组件的派生类”有人可以解释这是为什么吗?

vector<Component*>components;
CPU x;
CPU*y = new CPU();

components.push_back(&x) // results in debug error
components.push_back(y) // works fine.

writeTofile(components);

【问题讨论】:

  • 您得到的“调试错误”是什么?还有什么是Object,它与CPU有什么关系?
  • 要获得有意义的答案,您应该提供MCVE,即一个最小的完整可验证示例。

标签: c++ object stack heap-memory


【解决方案1】:

这样做

CPU x; components.push_back(&x);

您在堆栈上创建一个本地对象并将其地址推送到向量。当函数超出范围时,您的本地对象不再存在,并且它在向量中的地址无效。

【讨论】:

  • 确实存在。这里x 是一个临时对象。如果它的生命周期小于components 的生命周期,那就是一个错误。如果不是这样,请详细说明您的示例,回答@Botje的问题
  • 如果我声明static CPU x,问题也会消失吗?
  • 你用的是哪本书@Greg
  • 是的,但这不是管理内存的好方法。 c++ 方式要么只是将vector&lt;object&gt; 用于非继承类型,要么将vector&lt;shared_ptr&lt;object&gt;&gt;make_shared 用于虚拟层次结构。
猜你喜欢
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 2010-12-08
  • 2018-01-06
  • 2019-12-13
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多