7

在 DLL 边界上公开 STL 容器不是一个好主意,而且通常是不可能的(请参阅这个答案了解为什么,以及这个关于在 dll 边界上公开 std::list 的答案)。我需要能够在使用不同(VC08/VC10+)编译器编译的 DLL 和 EXE 之间传递数据;此 Q仅处理相同的所有内容。

暴露它们的最佳方法是什么?向量与列表有点不同,因为内存保证是连续的,所以如果我只需要一个双精度的 const 向量,我可以只提供指向 dll 中函数块的开始和结束指针吗?dll 还需要返回一些结构,例如向量数组。

我想知道一个包含开始和结束指针的结构:

template <typename T>
struct vecWrapper<T> {
    T*  begin;
    T*  end;
}

// in the dll
int func(vecWrapper<double> numbers);

这会是明智的吗?大概从函数返回的任何东西都需要一个析构函数(在 dll 端)来破坏它指向的东西。

4

1 回答 1

3

你已经搞定了。该标准要求向量元素在内存中是连续的,并且除非您使用向量的分配器玩游戏,否则向量元素不会被堆栈分配,因此始终可以将向量的数据表示为开始和结束指针(或一个开始指针和一个大小,如果那是你的事)。你所拥有的应该可以正常工作。

但是,我不确定这有多大用处。 std::vector除了自动内存管理之外,并没有真正为您提供任何东西,而且您不希望这样做;否则,您在 DLL 中构造的任何向量在被破坏时都会释放您的原始双精度数组。你可以通过复制数组来解决这个问题,但你已经说过你也不想这样做。STL 算法在指针上工作得很好,所以也许不需要在 DLL 中进行转换。

于 2012-06-25T17:11:24.610 回答