0

我的 cpp 项目在头文件中有静态二维数组,但它导致 chkstk 错误。我想让它动态化。是否真的可以在标题中进行更改,因为对项目的所有部分(大约 12000 行代码)进行更改是很困难的。

4

1 回答 1

0

根据Dietmar 对类似问题的回答,很可能您需要将静态二维数组放入一个函数中,以便及时对其进行初始化。

像这样:

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 数组的开销。

于 2012-12-16T07:47:05.840 回答