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

C++ 静态函数中的非静态数据持续时间,c++,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

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

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();

<> P>在C++规范中,找到类似这样的行为的最佳方法是什么?我有N3225=10-0215,但即使查看索引和我发现的内容,我也需要大量阅读,而不保证有答案

查看您的代码,它似乎不是实际初始化静态数据成员“array\u int”的方法,而是创建了一个同名的本地数组,并将其作为返回值返回。这实际上会导致两个错误:

  • “array_int”成员未初始化。编辑:我的错误,没有注意到您使用返回值初始化静态成员。忽略这一点
  • “array_int_init()”的返回值是本地数组的地址,该地址在方法返回后将无效。实际上,该数组中的值指向其他本地int变量,一旦函数返回,这些变量的地址也将无效
  • 但是,为了回答您的一般问题,是的-调用静态类函数(它甚至不必返回任何内容)来初始化静态类成员就足够了,它们将一直保持初始化状态,直到程序结束

    编辑:根据评论,我想这里有一些混乱,所以我会尝试给出更好的解释

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


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

    查看您的代码,似乎不是该方法实际初始化静态数据成员“array\u int”,而是创建一个具有相同名称的本地数组,并将其作为返回值返回。这实际上会导致两个错误:

  • “array_int”成员未初始化。编辑:我的错误,没有注意到您使用返回值初始化静态成员。忽略这一点
  • “array_int_init()”的返回值是本地数组的地址,该地址在方法返回后将无效。实际上,该数组中的值指向其他本地int变量,一旦函数返回,这些变量的地址也将无效
  • 但是,为了回答您的一般问题,是的-调用静态类函数(它甚至不必返回任何内容)来初始化静态类成员就足够了,它们将一直保持初始化状态,直到程序结束

    编辑:根据评论,我想这里有一些混乱,所以我会尝试给出更好的解释

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


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

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

    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];
    }
    

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

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

    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];
    }
    

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

    typedef class Foo{…}Foo不再是必需的。一个简单的
    类Foo{}绝对够用。@ PulbOS:事实上,C++中从来都不是必须的。@ SBI抱歉,因为缺乏清晰性:我想说:在C中是必要的,但是C++中已经不存在了。不管我做什么,有人介意吗?它帮助我处理我的工作流模板、别名、COM等等。。。。我将在这里重复??>。我不介意使用
    typedef
    a,只要我不必使用您的代码;)这很奇怪,让你想知道,在我看来,什么是问题。
    typedef类Foo{…}Foo不再是必需的。一个简单的
    类Foo{}绝对够用。@ PulbOS:事实上,C++中从来都不是必须的。@ SBI抱歉,因为缺乏清晰性:我想说:在C中是必要的,但是C++中已经不存在了。不管我做什么,有人介意吗?它对我的工作有帮助