在DLL边界上公开STL容器不是一个好主意,通常不可能(请参阅this answer for why和this one关于在dll边界上公开std :: list)。我需要能够在用不同的(VC08 / VC10 +)编译器编译的DLL和EXE之间传递数据; this Q仅处理所有相同内容。
揭露它们的最佳方式是什么?向量与列表有点不同,因为内存保证是连续的,所以如果我只需要一个双向的const向量,我可以只提供块的开始和结束指针到dll中的函数吗? dll还需要返回一些像向量数组的结构。
我想知道一个包含开始和结束指针的结构:
template <typename T>
struct vecWrapper<T> {
T* begin;
T* end;
}
// in the dll
int func(vecWrapper<double> numbers);
这是明智的吗?据推测,从函数返回的任何内容都需要一个析构函数(在dll端),它会破坏它所指向的东西。
答案 0 :(得分:3)
你几乎已经钉了它。该标准要求向量元素在内存中是连续的,并且向量元素不会被堆栈分配,除非您使用向量的分配器玩游戏,因此始终可以将向量的数据表示为开始和结束指针(或一个开始指针和一个大小,如果这是你的事情)。你有什么应该工作正常。
然而,我不确定它有多大用处。除了自动内存管理之外,std::vector
并没有真正提供任何东西,你不需要这样做;否则,您在DLL中构造的任何向量将在解构时释放您原始的双精度数组。你可以通过复制数组来解决这个问题,但是你已经说过你也不想这样做。 STL算法在指针上工作正常,因此可能不需要在DLL中进行转换。