0

我对动态分配有一个非常基本的看法。按照可能的语法研究树我已经说过它们都是动态分配。

第一的:

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

然后是更简洁的一个:

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

甚至:

int*px(new int(20));

然后在同样的解释中,我被告知第三种情况实际上是静态分配。比我糊涂了。

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

非常感谢。

4

2 回答 2

2

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

学究式地,指针px是一个自动变量,它指向的 ( *px) 是一个动态分配的变量。

px当它自动超出范围时被销毁,*px必须明确清除(通过 a delete px;

于 2015-01-20T15:12:01.490 回答
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 或 malloc 的函数/运算符。

于 2015-01-20T16:21:04.623 回答