2011-07-05 31 views
1

起初的一些介绍:我目前正在研究一个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包含的类,这个类包含一个std ::没有STL的基本类的列表。因此解包意味着将外部数组复制到std :: vector中,并将每个内部数组复制到std :: list中。

只有当我使用不同的编译器选项时,才会出现此错误,在同一个项目中打包和拆包工作得很好。

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

Regards

+0

不幸的是,我相信如果没有使用相同的选项进行编译,就无法解决这个问题。请参阅:http://stackoverflow.com/questions/4446620/returning-strings-from-dll-functions – Maxpm

+0

有一些事情你必须知道,但在做了一些更改我的代码后,我能够得到它与此编译方法。但是它只是开始在一个简单的'递归包装'上崩溃,如果这个概念在没有内部STL对象的情况下工作,我根本没有发现问题。 –

+0

@Marcel为什么你认为阵列兼容不同的包装选择?通常他们不是 – user396672

回答

1

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

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

这可能不会解决包装问题(谁改变包装设置吗?...),但它是你想要的东西时,使用多个堆。

+0

是的,我真的需要两个版本的STL。不要担心我使用两堆,因为我找到了处理内存分配的方法。包装设置是什么意思?我谈到了编译器设置的差异,例如在Debug和Release中,它们很难一起编译。 –

+0

@Marcel Bonzelet我指的是通过使用[编译指示包](http://msdn.microsoft.com/en-us/library/2e70t5y1(v = VS.100).aspx)或者[/ zp](http://msdn.microsoft.com/en-us/library/xh3e3fd0(v=VS.100).aspx)切换。确保它们是相同的 - 如果你不知道它们做什么,那么它们没有理由不具有(相同)默认值。 – eran

+0

我在这两个项目中都使用默认值。 –