将可变大小数组传递给DLL有什么选择?

Muc*_*ewe 4 c++ arrays dll boost memory-management

我想知道如果我想将运行时确定大小的数组传递给DLL函数,我有什么样的选项.目前我在DLL中的函数签名看起来像

#ifdef BUILDING_DLL
#define DBUILDING __declspec(dllexport)
#else
#define DBUILDING __declspec(dllimport)
#endif

void __cdecl DBUILDING myFunc(const double t, const double x[], double *xdot);
Run Code Online (Sandbox Code Playgroud)

所以我传递的是在一些类中动态分配的普通旧数据类型,然后必须手动删除.我宁愿不必调用删除并担心内存管理,所以我想看看其他选项.显而易见的选择是向量,但我知道你不应该将STL容器传递给dll,所以我还需要其他东西.我需要处理内存管理的东西,但我也可以传递给dll.

我当前的想法可能是使用boost :: scoped_array及其get()函数以指针形式返回原始数据.这看起来像是最好的主意还是有些东西我会忽略?

Ben*_*igt 5

你是对的,在DLL边界上共享C++对象,特别是标准中定义的类是个坏主意.只有一些原因是违反One Definition Rule并混合使用不同的分配器.

但是,没有什么可以阻止您传递vector跨越DLL边界的内容:

vector<double> x;
// ... fill it in, change the size
myFunc(t, &x[0], x.size(), xdot);
Run Code Online (Sandbox Code Playgroud)

请注意,您几乎总是必须将大小作为额外参数传递.