使用C ++库的动态内存分配

时间:2015-01-01 22:18:26

标签: c++

我试图使用Alglib的样条函数,为了做到这一点,我必须用我的数据初始化一个数组并将其传递给Alglib的样条函数。

我一直认为n_c必须是一个常数错误。有没有办法解决?我已经使用了矢量来获得积分。当我构建样条曲线时,大小不会改变。

void Connector::UniformSpacing(int n)
{
    double arcL = Length();
    double ds = arcL / ((double)n);
    static const int n_c = points.size();
    alglib::real_1d_array x[n_c]; // Error here, n_c is still not a constant

    alglib::spline1dbuildcubic()
}

3 个答案:

答案 0 :(得分:3)

仅仅因为变量是堆栈上的static const对象并不意味着它是一个编译时常量:在首次调用该函数时,该变量在运行时初始化。但是,对于内置数组,大小需要在编译时知道。您可以将它设为constexpr,在这种情况下,编译器将拒绝编译初始化,除非在编译期间可以计算出来。

使用运行时大小的最简单方法是使用

std::vector<alglib::real_1d_array> x(n_c);

对于这种类型,在编译时不需要知道大小。

答案 1 :(得分:0)

n_c必须是编译时间常量。

答案 2 :(得分:0)

如果需要一个只能在运行时指定其大小的数组,则需要使用无数动态大小的结构之一。根据您是否要将此新分配的数组的所有权传递给调用库,请使用以下两种结构之一:

std::unique_ptr<alglib::real_1d_array[]> x(new alglib::real_1d_array[n_c]);
  1. 将所有权转移到调用库函数(例如libfunc) - 您可以在release上致电unique_ptr并致电如下:libfunc(x.release())
  2. 保留所有权 - libfunc(x.get())
  3. 当然,在&#34;保留所有权&#34;例如,假设图书馆不会释放这段记忆。