了解基本动态分配示例

时间:2015-01-20 15:08:56

标签: c++ pointers memory-management dynamic-allocation static-allocation

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

首先:

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

然后是一个更简洁的一个:

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

甚至:

int*px(new int(20));

然后在同一解释的第二个时刻,我被告知第三种情况实际上是静态分配。比我困惑。

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

非常感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

你的第一个例子:

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

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

在你的第二个例子中:

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

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

在你的上一个例子中:

int*px(new int(20));

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

相同
int* px = new int(20);

所以要回答你的问题,只有包含“new”的行才是动态内存分配。

new =堆分配,否则分配堆栈,除非你正在调用一个使用new或malloc的函数/运算符。