将动态内存分配与C++库结合使用

Using dynamic memory allocation with C++ Libraries

本文关键字:结合 C++ 动态 内存 分配      更新时间:2023-10-16
我正在尝试使用 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()
}

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

使用

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

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

对于此类型,无需在编译时知道大小。

n_c必须是编译时常量。

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

std::unique_ptr<alglib::real_1d_array[]> x(new alglib::real_1d_array[n_c]);
  1. 将所有权传递给调用库函数(比如libfunc) - 您将在unique_ptr上调用release并按如下方式调用: libfunc(x.release()) .
  2. 保留所有权 - libfunc(x.get()) .

当然,在"保留所有权"的情况下,假设库不会释放此内存。