静态变量动态分配

时间:2012-11-20 19:31:11

标签: c++ dynamic static

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

所以,如果我有这样的功能:

void f(int n) {

  static int *a = new int[n];

}

我先打电话

f(1)

然后

f(3)

第二次通话后阵列有多大?

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:6)

当控制流第一次到达声明时,

static局部变量将被初始化。在这种情况下,自您第一次使用1作为n参数以来,您将为一个int分配大小。

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

答案 2 :(得分:2)

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

static int *a = new int[n];

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

答案 3 :(得分:0)

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