gpt4 book ai didi

c++ - C++中的内存分配

转载 作者:可可西里 更新时间:2023-11-01 18:16:33 26 4
gpt4 key购买 nike

我对 C++ 中的内存分配感到困惑,如 Const 数据区、Stack、Heap、Freestore、Heap 和 Global/Static 区等内存区域。我想了解以下代码段中的内存分配模式。任何人都可以帮助我理解这一点。如果除了示例中提到的变量类型之外还有任何其他内容可以帮助更好地理解概念,请更改示例。

class FooBar
{
int n; //Stored in stack?

public:

int pubVar; //stored in stack?

void foo(int param) //param stored in stack
{
int *pp = new int; //int is allocated on heap.
n = param;
static int nStat; //Stored in static area of memory
int nLoc; //stored in stack?
string str = "mystring"; //stored in stack?
..
if(CONDITION)
{
static int nSIf; //stored in static area of memory
int loopvar; //stored in stack
..
}
}
}

int main(int)
{
Foobar bar; //bar stored in stack? or a part of it?

Foobar *pBar; //pBar is stored in stack

pBar = new Foobar(); //the object is created in heap? What part of the object is stored on heap

}

编辑:
令我困惑的是,如果 pBar = new Foobar(); 将对象存储在堆上,为什么 int nLoc;int pubVar; ,那是存储在堆栈上的对象的组件?听起来很矛盾。 pubvarpBar 的生命周期不应该相同吗?

最佳答案

“堆”和“堆栈”是与存储持续时间相关的过时、不准确和令人困惑的术语。

具有“自动存储持续时间”的对象就是傻子所说的“堆栈对象”。它们是您将在函数内部定义为“局部变量”的变量。当封闭 block 结束时,它们超出范围。

具有“动态存储持续时间”的对象是您借助关键字 new免费存储上创建的对象(或者,如果您很傻,malloc),然后随时用关键字 delete 销毁(或者,如果你傻,free)。

还有一些对象具有“静态存储持续时间”,它们受制于各种奇怪的初始化顺序规则和事物。我们倾向于尽可能不在惯用的 C++ 中使用它们。

至于您的代码示例中的特定变量,尽管术语有问题,但您的评论都是准确的。

附录:

“堆”和“堆栈”这两个术语已经过时了,这与过去最流行的运行时库使用这些数据结构分别存储动态分配和自动分配的对象(静态分配的对象不属于任何类别)有关,顺便说一下)。

如今,这并不总是正确的,而且 C++ 标准当然也没有强制要求,因为 C++ 标准不关心事物的存储位置。它只关心它们是如何创建和销毁的,以及它们的生命周期。

关于c++ - C++中的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4687310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com