【问题标题】:Are the data members in Stack or Heap memory in C++C ++中的堆栈或堆内存中的数据成员
【发布时间】:2021-09-17 17:14:27
【问题描述】:

只想知道数据成员在内存、堆或堆栈中的位置。
这是我的代码:

#include <iostream>

#define p(s) std::cout << s << std::endl

class Fook
{
public:
    char c = 'c';  //
    Fook() {
        p(c);
    }
};

class IDK
{
public:
    int* arr = new int[1]; //
    IDK() {
        Fook fook3;        //
        arr[0] = 90;
        Fook* fook4 = new Fook(); //
        p(arr[0]);
    }
};

int main(int argc, char const *argv[])
{
    Fook fook1;
    Fook* fook2 = new Fook();
    
    IDK idk1;
    IDK* idk2 = new IDK();

    return 0;
}

编译并给出预期的输出

c
c
c
c
90
c
c
90

在上面的代码示例中,obj *fook2*idk2 分配在堆内存上,fook1idk1 分配在堆栈内存上。

  1. 在栈内存上是fook2-&gt;c(obj在堆内存上)
  2. *arr in idk1 在堆内存上(obj 在栈内存上)
  3. 在堆内存上的idk2中是*arr
  4. 是堆内存上idk1ctor中的*fook4
  5. 是堆内存上idk2ctor中的fook3
  6. 是堆内存上idk2ctor中的*fook4

总结一下,
int main(int argc, char const *argv[])中创建的每个对象的数据成员在内存(栈还是堆)中的什么位置

【问题讨论】:

标签: c++ object memory


【解决方案1】:

首先:栈和堆不是C++语言的概念,而是实现的概念。 C++ 标准讨论的是自动和动态存储。但为简单起见,我们只讨论堆栈和堆。

通常new 运算符会将您的对象放在堆上(除非new 运算符重载)。否则,您的对象将进入堆栈。

  1. 在栈内存上是fook2-&gt;c(obj在堆内存上)

Fook 对象的c 部分将与对象所在的位置相同。在fook2 的情况下,它是堆。注意细微之处。您说fook2-&gt;c 是箭头运算符:它实际上加载了c(除非重载)。所以结果会落在fook2-&gt;c 左侧的任何位置。

  1. *arr in idk1 在堆内存上(obj 在栈内存上)

同样:IDK 对象上的 arr 字段存在于对象所在的任何位置。在idk1 的情况下,我们有arr 指针存在于堆栈中。但是它指向的东西,即*arr 存在于堆上(因为使用了new)。这里也有一个微妙之处:* 运算符实际上将数据加载到左侧的任何位置(同样:除非重载)。

  1. *arr 在堆内存上的idk2

idk2 存在于堆上,因此arr 指针存在于堆上。此外,*arr 存在于堆中,因为它是通过 new 运算符声明的。

  1. *fook4 in ctor of idk1 on the heap mem

fook4 指针位于堆栈中。它指向的数据存在于堆中。

  1. fook3 in ctor of idk2 on the heap mem

fook3 对象存在于堆栈中。总是。在堆对象idk2new 初始化期间调用构造函数并不重要。构造函数只是一个函数,有点特殊,但与其他函数并没有真正的区别。构造函数甚至不知道它是在堆对象还是栈对象上调用的,它并不关心。

  1. 是堆内存上idk2ctor中的*fook4

与 (3) 和 (4) 类似,fook4 指针位于堆栈上,而它指向的数据(即 *fook4)位于堆上。

【讨论】:

    【解决方案2】:

    基本上

    • fook1:完全在堆栈上。
    • fook2:完全在堆中。
    • idk1int* 成员将在堆栈中,它指向的一个元素数组将在堆中。
    • idk2int* 将在堆上,它指向的数组也将在堆上。

    【讨论】:

    • 这是假设系统是用栈和堆实现的,这是一个相当安全的假设。但不能保证。熟练的向导可以使用仓鼠轮和 Robocop 的旧 VHS 副本实现自动和动态存储。
    • 点了,但是... idk... 我想我回答这类问题的哲学是在这个人似乎处于的水平上回答。这是有人询问基础知识,所以我给他们基本的答案。尽管自动和动态存储是正确的术语,但很多材料都谈到了“堆栈”和“堆”。
    • 评论不是针对你的。是给追随者的。如果我的答案有问题,就会投反对票。
    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2012-09-06
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多