【问题标题】:C++ where these objects are stored heap or stack? [duplicate]C++ 这些对象是存放在堆里还是栈里? [复制]
【发布时间】:2021-02-05 21:08:22
【问题描述】:

我写了这段代码,谁能解释在堆和堆栈中创建了多少对象? myStudent 对象是在堆还是堆栈中? 第二个问题,main方法本身和main方法里面的东西是存放在stack里的吗?

class Student
{
public:
    Student()
    {
        id = 0;
    }
private:
    int id;
};
Student studentCreator()
{
    Student* s = new Student();
    return *s;
}
int main()
{
    Student myStudent = studentCreator();
    return 0;
}

【问题讨论】:

  • 您认为它们存储在哪里?你为什么要写这样的代码?不要使用new 和原始拥有指针
  • C++ 中没有与堆和栈内存相关的内容。 C++ 使用自动存储持续时间和动态存储持续时间。这些实际存储在哪里,C++ 不在乎。
  • s 在堆栈上,*s 在堆上(因为它从未被释放而被泄露)。 studentCreator() 返回分配给myStudent*s 的副本,该副本位于main 的堆栈帧上。
  • @NathanOliver "heap" 是用于动态数据的内存区域的常用名称,"stack" 是用于自动数据的内存区域的名称。与同名操作系统段的任何关系纯属巧合。
  • 另外值得注意的是这段代码会泄露内存。无法完成必要的delete,因为分配对象的地址丢失了。

标签: c++ stack heap-memory


【解决方案1】:

myStudent 在堆栈上。在函数调用期间,您在堆中创建了一些东西并丢失了它的引用。

【讨论】:

  • 将对其进行编辑。 ;)
  • 信不信由你,编译器可以将myStudent 存储在寄存器中,因为它只有一个整数字段。对于大多数处理器,寄存器既不在堆也不在堆栈中。
【解决方案2】:

这里你在堆栈上有myStudent,因为该函数在堆上创建了一个学生,但返回它以取消引用它,那么你就有内存泄漏。 main函数由操作系统存储在栈中。

【讨论】:

  • "主函数存储在栈上" -- 不清楚你说的这些话是什么意思。您的意思是函数main 的实际代码存储在堆栈中(这是错误的)?
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 2012-07-29
  • 2016-12-27
  • 2011-02-03
  • 1970-01-01
  • 2010-11-15
  • 2013-12-09
  • 2014-08-14
相关资源
最近更新 更多