首先介绍一些内容:我目前正致力于C ++兼容性事务,这意味着能够使用不同的编译器选项来运行彼此的项目。因此,我使用Release DLL和一个链接到该项目的Debug应用程序进行测试。 使用STL时会出现大多数问题,所以我必须确保两个项目都只使用自己的STL版本。 Thatswhy我有一个包装类,可以用std :: vectors,std :: lists等构建,但只包含一个完全兼容的数组。现在我可以将值包装在一个数组中,然后将它们解压缩到一个有效的STL对象中。
现在更接近问题:有些类包含STL但也需要包装到数组中。所以我也必须包装内部STL对象,这意味着添加标记并将其保存在关联的数组元素旁边。
构建这个包装类完全没问题,但解压缩它会在向量类中发生访问冲突而崩溃:
const_reference operator[](size_type _Pos) const
{ // subscript nonmutable sequence
#if _HAS_ITERATOR_DEBUGGING
if (size() <= _Pos)
{
_DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
#endif /* _HAS_ITERATOR_DEBUGGING */
_SCL_SECURE_VALIDATE_RANGE(_Pos < size());
return (*(_Myfirst + _Pos)); <---- HERE
}
此时正在执行的代码是:
template<class T>
struct mwContainerItem
{
T m_element;
void * m_tag;
};
template<class T>
class mwContainer
{
STLList ToList()
{
STLList l;
for(size_t i=0; i<m_size; ++i) <---- It crashes when accessing m_size
{
l.push_back(m_elements[i].m_element); <---- It also crashes when accessing m_elements
}
return l;
}
mwContainerItem<T>* m_elements;
size_t m_size;
};
关于它的奇怪之处在于我正在解压缩std :: list但它在std :: vector中崩溃了。查看我有一个std :: vector包含的类的东西,这个类包含一个没有STL的基本类的std :: list。所以解压缩意味着将外部数组复制到std :: vector中,将每个内部数组复制到std :: list中。
当我使用不同的编译器选项时,只会出现此错误,在同一个项目中打包和解压缩工作正常。
我真的希望任何人都可以帮助我,因为我没有任何想法。
此致
答案 0 :(得分:1)
你真的需要两个版本的STL吗?我的意思是,您是使用两个不同的编译器和两个不同的STL实现构建这两个项目吗?混合调试版和发布版时,问题通常来自于有两个不同的堆。然后,尝试释放在另一个模块中分配的内存,将导致错误。如果您遇到这种情况,可以尝试另一种方法 - 两者都使用相同的堆。
如果您可以控制两个项目,则可以从DLL导出分配器(和匹配的deallocator),并在EXE中使用它。这样,内存管理将在一个堆上完成,而构建类型无关紧要。您可以在operator new,矢量/列表分配器等中使用它。
这可能无法解决打包问题(谁更改了打包设置?...),但是在使用多个堆时,这是你想要的。