动态分配的静态变量

static variable dynamically allocated

本文关键字:变量 静态 动态分配      更新时间:2023-10-16

函数中的静态变量在程序的生命周期内只分配一次。

因此,如果我有一个这样的函数:

void f(int n) {
  static int *a = new int[n];
}

我先打电话

f(1)

然后

f(3)

第二次调用后数组 A 会有多大?

函数

本地static变量在控件第一次通过它们时初始化。标准中的相关部分是 6.7 [stmt.dcl]。也就是说,数组将获取大小 1 并保持此大小,除非您显式更改其大小。

C++ 2011 的优点是初始化 static 变量也是线程安全的:如果在初始化变量时另一个线程到达实例,则第二个线程将被阻塞,直到初始化完成。

控制流首次到达声明时,将初始化static局部变量。在这种情况下,由于您第一次使用 1 作为 n 参数,您将为一个int分配大小。

做这种事情是个坏主意。您应该只使用本地、非静态、std::vector或其他更高级别的容器。

函数内静态变量的初始化仅在函数内静态语句的第一次计算期间发生。 第一次使用 f(1) 调用 f 时,将进行 a 的初始化,它将指向单个 int 的数组。 调用 f(3) 时,a 已被初始化,因此右侧:

static int *a = new int[n];

将不会再次评估,a将继续指向最初分配的大小为 1 的数组。

数组

的大小为 1,因为变量 'a' 的初始化只执行一次,第一次调用函数 'f' 时。