[置顶] std::vector传递dll参数异常-长度超限

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源)

 

如果你调用dll中的函数,使用了vector传递参数时,报错“vectorsize异常,长度超限代码位置_THROW(length_error, "vector<T> too long")”

 

那么你可能遇到了vectordebug版与release版不匹配问题。

 

在未作条件编译情况下,如果:

1.       调用程序使用debug版本vector

2.       Dll中使用release版本vector

则传递空的vector,会出现这个问题(当然了,传递非空vector也应该是有问题的)

 

问题产生的原因是:

VS中的STLdebug版本与release版本vector在内存分配上是有差别的,从而导致两边数据结构不一致,赋值的时候出现内存溢出相关问题。从而被误认为vector长度超限问题。

 

问题详细原因可以通过查看VSvector的代码:

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 转载请标明来源)

 

你可能感兴趣的:(vector长度超限,vector传递dll参数异常)