【问题标题】:What does an Object created on the stack contain?在堆栈上创建的对象包含什么?
【发布时间】:2020-04-09 06:27:22
【问题描述】:

假设我在不使用 new 运算符的情况下创建了一个对象:

Object b;

我正在使用我的对象类的默认构造函数。说这个类给对象一个属性 int objectID; 。 我知道我可以通过执行 b.Display() 来操作我的对象,例如,如果我定义了一个 Display() 方法。我知道当我以这种方式创建对象时,它的属性存储在堆栈中。

但我不明白b到底包含什么?

(我知道如果我以这种方式通过对象创建 Object * b = new Object; b 将指向将存储在堆上的属性 objectID。)

谢谢!

【问题讨论】:

  • 在第二个例子中b是一个指向对象的指针。我不太明白你在问什么。
  • 我问的是第一个例子。我理解的第二个例子。我将重新表述:在第一个示例中使用对象 b; b里面存储了什么值?
  • "我知道,当我以这种方式创建对象时,它的属性存储在堆栈中。" 1) 从技术上讲 - C++ 标准不会强制编译器完全使用堆栈。它只是定义了“自动变量存储”,以及对此的要求。堆栈只是一个实现细节。 2) 技术上#2:没有minimal reproducible example,就无法判断它是否会分配到“堆栈”上,因为这取决于声明此类变量的位置。例如:如果是全局变量,则不会在“栈”中分配。
  • b 包含一个Object。然后,您可以使用. 访问它的成员。 但是第二个例子中 b 怎么指向对象的第一个属性(意思是 objectID)? 这仅适用于标准布局类。如果您的类不是标准布局,则指针不一定指向第一个成员。指针指向Object
  • b 一个Object。它包含Object 包含的所有内容。我真的不明白你为什么要问。

标签: c++ object pointers memory-management stack


【解决方案1】:

如果您在堆上分配Object,它包含的数据与将存储在堆上的数据完全相同:成员变量、填充、vtable 指针、基类以及我忘记的任何其他内容。由于这是一个你必须绘制内存布局的练习,我假设Object 没有任何虚函数或基类,所以它只是成员变量和可能的填充。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 2010-12-08
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2012-08-12
    相关资源
    最近更新 更多