【问题标题】:static array allocation issue!静态数组分配问题!
【发布时间】:2010-02-26 21:50:43
【问题描述】:

我想静态分配数组。看看下面的代码,这段代码不正确,但它会让你知道我想做什么

class array
{
  const int arraysize;
  int array[arraysize];//i want to statically allocate the array as we can do it by non type parameters of templates
public:
  array();
};

array::array():arraysize(10)
{
  for(int i=0;i<10;i++)
    array[i]=i;
}

main()
{
  array object;
}

【问题讨论】:

  • Zia,你需要缩进你的代码。很难按原样阅读。
  • 您还没有提出问题。请提出一个我们可能会尝试回答的问题。
  • 您是否想要一个具有固定编译时间大小的类?在这种情况下,模板就是您要查找的关键字。
  • 我是为他做的,但你真的应该自己做 Zia。

标签: c++ arrays memory-management


【解决方案1】:

如果您的数组大小始终相同,请将其设为静态成员。整数类型的静态成员可以直接在类定义中初始化,如下所示:

class array
{
  static const int arraysize = 10;
  int array[arraysize];

  public:
    array();
};

这应该按照您想要的方式工作。如果每个数组类型的对象的数组大小并不总是相同,那么您不能这样做,您将需要使用模板参数、动态分配数组或使用 STL 容器类(例如std::vector)。

【讨论】:

    【解决方案2】:

    必须使用模板参数来完成,否则sizeof(array) 会因每个对象而异。

    这就是使用模板参数的方式。

    template <int N>
    class array
    {
       int data[N];
    
       // ...
    };
    

    或者,如果您不介意动态分配,您可以使用std::vector

    【讨论】:

      【解决方案3】:

      C++ 不允许变长数组(即大小不是编译时常量的数组)。在结构中允许一个将无法计算 sizeof(array),因为大小可能因一个实例而异。

      如果大小仅在运行时已知,请考虑改用 std::vector。这也避免了将数组大小存储在单独的变量中。请注意,从堆中分配(例如通过 std::vector)也允许更大的数组,因为可用的堆栈空间非常有限。

      如果您希望它成为编译时常量,请使用模板参数。那么你应该寻找已经实现了它的 Boost.Array。

      【讨论】:

        【解决方案4】:

        数组大小必须是编译时间常数。您快到了,您只需要初始化const 并将其也设为static。或者,使用动态数组或向量。

        【讨论】:

          【解决方案5】:

          编辑:请注意这个答案:这很可能是针对您的情况执行此操作的错误方法。但是如果你真的需要它是一个数组(而不是一个向量或其他什么)并且你真的需要它要动态分配,请执行以下操作:

          class array
          {
            int *p_array;
          
            public:
              array(int size);
          };
          
          array::array(int size)
          {
          p_array = malloc(size * sizeof(int));
          }
          

          只要确保你清理干净(IE 在你的析构函数中释放 p_array)

          【讨论】:

            猜你喜欢
            • 2017-05-07
            • 2011-04-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-17
            • 1970-01-01
            • 2022-01-14
            • 2021-01-02
            相关资源
            最近更新 更多