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”的方法,而是创建了一个同名的本地数组,并将其作为返回值返回。这实际上会导致两个错误:
函数数组_int_init()中还有一个局部变量,其地址作为函数的返回值返回。现在,由于该静态变量和用于填充该数组的所有int变量都是在堆栈上分配的,因此一旦函数返回,它们就不再有效(这意味着访问这些地址将导致未定义的行为)。它在VC10中工作的原因是,在函数返回之后,在堆栈上分配任何其他信息覆盖以前的数据之前,您正在访问返回的数组。但是,这在“真实”应用程序中不起作用。查看您的代码,似乎不是该方法实际初始化静态数据成员“array\u 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在C++中,代码>不再是必需的。一个简单的类Foo{}代码>绝对够用。@ PulbOS:事实上,C++中从来都不是必须的。@ SBI抱歉,因为缺乏清晰性:我想说:在C中是必要的,但是C++中已经不存在了。不管我做什么,有人介意吗?它帮助我处理我的工作流模板、别名、COM等等。。。。我将在这里重复??>。我不介意使用typedef
a,只要我不必使用您的代码;)这很奇怪,让你想知道,在我看来,什么是问题。typedef类Foo{…}Foo在C++中,代码>不再是必需的。一个简单的类Foo{}代码>绝对够用。@ PulbOS:事实上,C++中从来都不是必须的。@ SBI抱歉,因为缺乏清晰性:我想说:在C中是必要的,但是C++中已经不存在了。不管我做什么,有人介意吗?它对我的工作有帮助