了解基本动态分配示例

Understanding basic dynamic allocation example

提问人:Paul 提问时间:1/20/2015 最后编辑:eightShirtPaul 更新时间:12/15/2016 访问量:163

问:

关于动态分配,我有一个非常基本的见解。按照可能的语法研究树,有人说它们都是动态分配。

第一:

int* px(nullptr); 
px = new int;
*px =20;

然后是更简洁的:

int* px(nullptr);
px = new int(20);

甚至:

int*px(new int(20));

然后,在同样的解释中,我被告知第三种情况实际上是静态分配。然后我感到困惑。

这是真的吗?有人可以解释一下为什么吗?

非常感谢。

C++ 指针 内存管理 动态分配 静态分配

评论

2赞 triclosan 1/20/2015
我相信应该是而不是*px = 20;px* =20;
0赞 Jonathan Wakely 1/21/2015
不,这不是真的。这三个示例都做同样的事情。

答:

2赞 Luchian Grigore 1/20/2015 #1

在所有示例中,您拥有的是静态和动态分配的组合,以及分别驻留在自动和动态内存中的 2 个变量。

迂腐地讲,指针是一个自动变量,它指向的 () 是一个动态分配的变量。px*px

px当它自动超出范围时被销毁,必须显式清除(通过*pxdelete px;)

评论

0赞 Paul 1/20/2015
谢谢你的回答。您能否通过您的文本具体说明您正在谈论哪个例子?
0赞 Luchian Grigore 1/20/2015
@Paul所有这些。它们都有一个静态分配的变量类型和一个动态分配的变量(由 或 指向的变量)。pxint*px*pxint
0赞 Aaron McDaid 1/21/2015
也许你可以从“所有三段代码几乎完全相同的事情”开始这个答案。
2赞 Michael B. 1/21/2015 #2

您的第一个示例:

int* px(nullptr);
px = new int;
*px =20;

第一行创建一个堆栈分配的指针,并为其分配值“nullptr”。第二行创建一个在堆上分配的整数,并将指向该整数的指针分配给 px。最后一行取消引用 px 并将 20 分配给堆值。

在第二个示例中:

int* px(nullptr);
px = new int(20);

第二行创建一个在堆上分配的 int,值为 20,并将其指针分配给 px。

在上一个示例中:

int*px(new int(20));

您正在创建一个值为 20 的堆分配整数,其指针将作为参数传回以初始化整数指针 px。这与以下相同:

int* px = new int(20);

因此,为了回答您的问题,只有包含“new”的行是动态内存分配。

new = heap allocated,否则它是堆栈分配的,除非你调用的函数/运算符在后台使用 new 或 malloc。