【问题标题】:Is the allocation of C++ non pointer data members in pointer class instance on the heap or on the stackC++非指针数据成员在指针类实例中的分配是在堆上还是在栈上
【发布时间】:2013-10-22 11:47:45
【问题描述】:

我有以下课程:

class CObj {
private:
    MyOtherClass _member;
};

以及创建 CObj 类实例的以下代码:

CObj* obj = new Cobj;

obj 分配在堆上,但是: CObj::_member 也分配在堆上吗?还是在堆栈上?

【问题讨论】:

  • 它是CObj成员,你怎么看? :)
  • 最重要的是 - 你为什么在乎?

标签: c++ c pointers memory


【解决方案1】:

obj 是“在堆栈上”分配的指针; obj 指向的对象是“在堆上”,并且作为 obj->_member 的成员(=一部分),它也在堆上。

通常,成员作为父对象的一部分,分配在存储其父对象的任何位置。

【讨论】:

  • @IvanIshchenko 没有足够的代码知道它在哪里,但它看起来像自动存储或“堆栈”。你想到的是new创造的东西,而不是obj本身。
  • 据我了解,obj OP 是一个 Cobj 的实例,而不是一个指针。
  • @IvanIshchenko OP 很困惑。这是解决这个问题的好机会:)
  • 哇,感谢这么多回复,感谢大家抽出宝贵时间回答我的问题。
【解决方案2】:

_member 具有自动存储持续时间 - 它被分配在它拥有的对象被分配的地方。因此,如果您使用 动态存储持续时间 创建 CObj 的实例,就像在您的示例中一样,它也将在动态存储(堆)中分配。如果您创建一个具有自动存储期限的对象,它将在堆栈上。

这类问题的问题在于C++没有stackheap的概念——它只是storage durations

【讨论】:

  • _member有自动存储期限吗?它具有包含它的对象的存储持续时间。
  • 当然,不仅仅是存储时间;还有对象生命周期(在构造函数和析构函数运行时确定)。
【解决方案3】:

当您调用new 时,操作系统分配与堆上类大小一样多的内存并调用类构造函数。

从这里你可以看到,由于MyOtherClassCObj 中并且CObj 持有MyOtherClassMyOtherClass 也与CObj 在同一空间的堆上。

【讨论】:

    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2020-09-02
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多