【发布时间】:2012-12-16 06:58:33
【问题描述】:
我的 cpp 项目在头文件中有静态二维数组,但它会导致 chkstk 错误。我想让它动态化。是否真的可以在标题中进行更改,因为对项目的所有部分(大约 12000 行代码)进行更改是很困难的。
【问题讨论】:
-
使用单例模式创建一个类,为您提供数组实例。
标签: c++ dynamic multidimensional-array
我的 cpp 项目在头文件中有静态二维数组,但它会导致 chkstk 错误。我想让它动态化。是否真的可以在标题中进行更改,因为对项目的所有部分(大约 12000 行代码)进行更改是很困难的。
【问题讨论】:
标签: c++ dynamic multidimensional-array
根据Dietmar's answer on a similar problem,很可能您需要将静态二维数组放入一个函数中,以便及时初始化。
像这样:
double**& my_array()
{
static double** local = NULL;
if(!local)
{
// init your array here
}
return local;
}
并且您需要在代码中引用您的数组,例如 my_array() 而不是 my_array。
编辑:
对于icepack 的问题:是的,它看起来很奇怪(在我看来,无论如何都应该将多数组包装到一个类中,这样就不会发生)。使用这种奇怪的返回类型的原因如下:
// if you returned double** instead of double**&
my_array() = other_array; // would overwrite a temporary pointer
my_array(); // would be still the old array
如果你使用 C++11,最干净的解决方案是:
typedef std::array<std::array<double, second_dim>, first_dim> my_array_t;
my_array_t& my_array()
{
static my_array_t local = initial_value();
return local;
}
你使用my_array和以前一样,使用my_array()。
即使你不使用 C++11,我也建议你定义自己的 2d_array 类,无论如何,只要你写得好,它就不会比 C 数组产生任何开销。
【讨论】:
double**& ?怎么回事?这样的代码不应该由任何体面的程序员创建。