首页 > 代码库 > std::vector传递dll参数异常-长度超限
std::vector传递dll参数异常-长度超限
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
如果你调用dll中的函数,使用了vector传递参数时,报错“vector的size异常,长度超限”代码位置 “_THROW(length_error,"vector<T> too long")”
那么你可能遇到了vector的debug版与release版不匹配问题。
在未作条件编译情况下,如果:
1. 调用程序使用debug版本vector
2. Dll中使用release版本vector
则传递空的vector,会出现这个问题(当然了,传递非空vector也应该是有问题的)
问题产生的原因是:
VS中的STL的debug版本与release版本vector在内存分配上是有差别的,从而导致两边数据结构不一致,赋值的时候出现内存溢出相关问题。从而被误认为vector长度超限问题。
问题详细原因可以通过查看VS中vector的代码:
1. Vector继承自_Vector_val typedef _Vector_val<_Ty, _Ax> _Mybase; explicit vector(const _Alloc& _Al) : _Mybase(_Al)
2. _Vector_val继承自_CONTAINER_BASE_AUX_ALLOC _Vector_val(_Alloc _Al = _Alloc()) : _CONTAINER_BASE_AUX_ALLOC<_Alloc>(_Al), _Alval(_Al)
3. 跟踪看到,在Debug和Release时,分别走了不同的分支 #if !_HAS_ITERATOR_DEBUGGING && (defined(_DEBUG) || _SECURE_SCL) // We have an aux object. #define _CONTAINER_BASE_AUX_ALLOC _Container_base_aux_alloc_real #else // We don‘t have an aux object. #define _CONTAINER_BASE_AUX_ALLOC _Container_base_aux_alloc_empty #endif
而在_Container_base_aux_alloc_real(继承自_Container_base_aux)中有一个变量 _Aux_cont * _Myownedaux; 但在_Container_base_aux_alloc_empty(继承自_Container_base)是没有这个变量的。
查看宏定义中: #if !defined (_HAS_ITERATOR_DEBUGGING) #if defined (_DEBUG) #define _HAS_ITERATOR_DEBUGGING 1 /* for range checks, etc. */ #else #define _HAS_ITERATOR_DEBUGGING 0 #endif /* defined (_DEBUG) */ #else #if !defined (_DEBUG) && _HAS_ITERATOR_DEBUGGING != 0 #include <crtwrn.h> #pragma _CRT_WARNING( _NO_ITERATOR_DEBUGGING ) #undef _HAS_ITERATOR_DEBUGGING #define _HAS_ITERATOR_DEBUGGING 0 #endif #endif /* !defined (_HAS_ITERATOR_DEBUGGING) */
#if !defined (_SECURE_SCL) #define _SECURE_SCL 1 #endif
我这边调试时看到: Release版本走了分支_Container_base_aux_alloc_real。 Deubg版本走了分支_Container_base_aux_alloc_empty。 |
从上面可以看出,这个实际上是跟VS中STL实现有很大关系的,VS中的调试相关机制的依赖,使得debug/release版本数据结构上存在差异。
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)
std::vector传递dll参数异常-长度超限