静态函数中的非静态数据持续时间

时间:2011-01-04 08:13:25

标签: c++

我想初始化一个抽象接口的静态数组。我只是想知道调用静态函数来构建数据是否是一种有效的初始化方法。指针在下面的代码中指向的数据的生命周期是什么样的?

typedef class FOO {
public:
    static const int** array_int;
    static const int** array_int_init();

} FOO;

const int** FOO::array_int_init()
{
    const int A = 5;
    const int B = 6;
    const int C = 7;

    const int* array_int[] = { &A, &B, &C };

    return &array_int[0];
}
const int** FOO::array_int = array_int_init();

在C ++规范中找到有关此类行为的详细信息的最佳方法是什么?我有N3225 = 10-0215,但即使查看索引和我发现的内容,我需要阅读很多,没有答案的承诺。

2 个答案:

答案 0 :(得分:2)

您的变量是本地变量,当函数退出时它们将不再存在。如果你需要它们来生存,那么使用

将vars和array声明为函数内的静态
const int** array_int_init()
{
    static const int A = 5;
    static const int B = 6;
    static const int C = 7;

    static const int* array_int[] = { &A, &B, &C };

    return &array_int[0];
}

这些静态变量将持续与程序一样长,并在第一次调用函数时进行初始化(请注意,在多线程的情况下,如果初始化不像上面的情况那样简单,则需要一些额外的处理)。 / p>

答案 1 :(得分:1)

查看代码,似乎不是实际初始化静态数据成员'array_int'的方法,而是创建一个具有相同名称的本地数组,并将其作为返回值返回。这实际上导致了2个错误:

  1. 'array_int'成员未初始化。编辑:我的错误,没有注意到您使用返回值初始化静态成员。忽略这一点。
  2. 'array_int_init()'的返回值是本地数组的地址,一旦方法返回,该地址就无效。实际上,该数组中的值将本身指向其他本地int变量,一旦函数返回,其地址也将无效。
  3. 但是,回答你的一般问题,是的 - 调用静态类函数(它甚至不需要返回任何东西)来初始化静态类成员就足够了,它们将保持初始化直到程序结束。 / p> 编辑:根据评论,我想这里有一些混乱,所以我会尝试给出更好的解释。

    在原始代码中,有一个名为FOO :: array_int的静态数据成员。该数据成员未在代码中初始化或访问。

    函数array_int_init()中还有一个局部变量,其地址作为函数的返回值返回。现在,由于静态变量和其地址用于填充该数组的所有int变量都在堆栈上分配,因此一旦函数返回它们就不再有效(意味着访问这些地址将导致未定义的行为)。它似乎在VC10中工作的原因是您在函数返回后立即访问返回的数组,然后在堆栈上分配任何其他信息覆盖先前的数据。但是,这不适用于“真正的”应用程序。