将动态内存分配与C++库结合使用
Using dynamic memory allocation with C++ Libraries
我正在尝试使用 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]);
- 将所有权传递给调用库函数(比如
libfunc
) - 您将在unique_ptr
上调用release
并按如下方式调用:libfunc(x.release())
. - 保留所有权 -
libfunc(x.get())
.
当然,在"保留所有权"的情况下,假设库不会释放此内存。
相关文章:
- 多态性和功能结合
- 将 Vulkan 与 SFML 结合使用?
- 将 c++ 生成器应用程序与外部 dll 结合使用
- 如何将增强MSM与增强信号结合使用?
- MS Visual Studio 解决方案结合了非托管C++项目和 C# 项目
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- C++ 将函数指针与最佳性能相结合
- 将 Lua 与 C++ DLL 结合使用
- 为什么push_back和emplace_back结合在一起时,会有不同的行为
- 将 aws-iot-device-sdk-cpp-v2 与 CMake 结合使用
- 将2个欧拉角与GLM相结合的问题
- 结合std::execution和OpenMP是否可取
- 抽象和派生与std::list相结合
- 想要将 CGAL 与四元数相结合是否合乎逻辑
- 存储/传递 v8 承诺解析器供以后使用的最佳实践?(结合C++线程)
- 如何将 IAudioClient3 (WASAPI) 与实时工作队列 API 结合使用
- 可变参数模板与默认模板参数相结合
- 函数与返回类型 node* 与 C++ 中的 OOP 结合使用
- 是否可以将C++与任何语言相结合?