了解基本的动态分配示例
Understanding basic dynamic allocation example
我对动态分配有一个非常基本的疑问。按照可能的语法研究树,有人说它们都是动态分配。
第一个:
int* px(nullptr);
px = new int;
*px =20;
再来一个更简洁的:
int* px(nullptr);
px = new int(20);
甚至:
int*px(new int(20));
然后在同一解释的第二个时刻,我被告知第三种情况实际上是静态分配。比我困惑。
这是真的吗?有人可以解释一下为什么吗?
非常感谢。
您在所有示例中所拥有的是静态和动态分配的组合,以及分别驻留在自动和动态内存中的 2 个变量。
迂腐地说,指针px
是一个自动变量,它指向的(*px
)是一个动态分配的变量。
px
在超出范围时自动销毁,*px
必须明确清除(通过 delete px;
)
你的第一个例子:
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 = 已分配堆,否则它是已分配堆栈,除非您调用的 function/operator 在幕后使用 new 或 malloc。
我对动态分配有一个非常基本的疑问。按照可能的语法研究树,有人说它们都是动态分配。
第一个:
int* px(nullptr);
px = new int;
*px =20;
再来一个更简洁的:
int* px(nullptr);
px = new int(20);
甚至:
int*px(new int(20));
然后在同一解释的第二个时刻,我被告知第三种情况实际上是静态分配。比我困惑。
这是真的吗?有人可以解释一下为什么吗?
非常感谢。
您在所有示例中所拥有的是静态和动态分配的组合,以及分别驻留在自动和动态内存中的 2 个变量。
迂腐地说,指针px
是一个自动变量,它指向的(*px
)是一个动态分配的变量。
px
在超出范围时自动销毁,*px
必须明确清除(通过 delete px;
)
你的第一个例子:
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 = 已分配堆,否则它是已分配堆栈,除非您调用的 function/operator 在幕后使用 new 或 malloc。