【发布时间】: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