首先是一些介绍:我目前正在研究 C++ 兼容性,这意味着能够运行具有不同编译器选项的项目。因此,我使用一个发布 DLL 和一个链接到该其他项目的调试应用程序进行测试。大多数问题都是在使用 STL 时出现的,所以我必须确保两个项目都只使用它们自己的 STL 版本。这就是为什么我有一个包装类,它可以由 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 中。
此错误仅在我使用不同的编译器选项时发生,在同一个项目中打包和解包工作得很好。
我真的希望任何人都可以帮助我,因为我不知道。
问候