向量索引器处的奇怪访问冲突

时间:2011-07-05 09:25:09

标签: c++ stl vector access-violation binary-compatibility

首先介绍一些内容:我目前正致力于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中。

当我使用不同的编译器选项时,只会出现此错误,在同一个项目中打包和解压缩工作正常。

我真的希望任何人都可以帮助我,因为我没有任何想法。

此致

1 个答案:

答案 0 :(得分:1)

你真的需要两个版本的STL吗?我的意思是,您是使用两个不同的编译器和两个不同的STL实现构建这两个项目吗?混合调试版和发布版时,问题通常来自于有两个不同的堆。然后,尝试释放在另一个模块中分配的内存,将导致错误。如果您遇到这种情况,可以尝试另一种方法 - 两者都使用相同的堆。

如果您可以控制两个项目,则可以从DLL导出分配器(和匹配的deallocator),并在EXE中使用它。这样,内存管理将在一个堆上完成,而构建类型无关紧要。您可以在operator new,矢量/列表分配器等中使用它。

这可能无法解决打包问题(谁更改了打包设置?...),但是在使用多个堆时,这是你想要的。