1. 程式人生 > >std::vector傳遞dll引數異常-長度超限

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 轉載請標明來源)

相關推薦

std::vector傳遞dll引數異常-長度

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 轉載請標明來源) 如果你呼叫dll中的函式,使用了vector傳遞引數時,報錯“vector的size異常,長度超限” 程式碼位置 “_THROW(length_error, "

Json序列化失敗,長度

system serializa 解決方案 length json序列化 config bsp pts ati 今天在開發代碼的時候發現一個異常:“使用 JSON JavaScriptSerializer 進行序列化或反序列化時出錯。字符串的長度超過了為 maxJsonLe

std::list/vector 作為函式引數傳遞方式

       專案中的一個小bug。主觀性認為 std::list 作為函式引數,是按指標傳遞的,實際還是按值傳遞的(不解!!)。 舉例如下   1 #include <iostream>   2 #include <list>   3 

C#呼叫C/C++ DLL 引數傳遞和回撥函式的總結

Int型傳入: Dll端: extern "C" __declspec(dllexport) int Add(int a, int b) {     return a+b; } C#端: [DllImport("aeClient2.0.dll", CallingCo

dll中介面中使用std::string和std::vector

最近在windows下封裝dll給客戶,介面引數型別都是std::string,直接在release模式下生成,客戶也沒什麼反饋。但是自己線下在debug模型下測試的時候引數始終傳遞不過去,除錯覺得記憶

Qt中純C++項目發布為dll的方法(詳細步驟)

exe 程序 con ostream address 只需要 include free windows 眾所周知,我們可以將C++項目中的類以及函數導出,形成 .dll 文件,以供其他程序使用,下面將說明Qt環境下的使用方法。 首先創建共享庫,步驟如下:

***四種參數傳遞的形式——URL,鏈接,js,form表單

ont meta get span form表單 用戶名 傳遞參數 rip con 什麽時候用GET, 查,刪 什麽時候用POST,增,改 (特列:登陸用Post,因為不能讓用戶名和密碼顯示在URL上) 4種get傳參方式 <html xmlns="http:/

C++:如何高效的使用std::vector

目錄: 一、在std::vector尾部新增物件時應儘量使用emplace_back,而不要使用push_back 二、新增多個元素前應使用reserve設定容量,防止擴容時發生元素複製 三、刪除元素時應從最後一個元素開始刪除,不要從中間開始刪除 四、新增新物件時應從結尾處新增,而不

Ajax傳遞複雜引數到伺服器端的方法

我們大概都知道,使用Ajax傳遞簡單引數到伺服器端(SpringMVC)的方法,如下: $.ajax({ type : "POST", url : CONFIG.mec_otm.order + "/cancel", data : { "resu

類模板 "std::array" 的引數太少

在從VS2013專案遷移過來的時候,用的array<System::String ^> ^出現錯誤錯誤(活動)    E0442    類模板 "std::array" 的引數太少    這時候是因為C++ 11引入

Accelerated C++ —— 簡易版std::vector類的實現

#include <memory> #include <iostream> #include <algorithm> namespace Ming { template<class T> class vec { public: typed

2018-10-14 ref引用傳遞 out引數

ref引數 將一個變數傳入一個函式中進行 “處理”,“ 處理”完成後,再將“處理”結果帶出函式 要求: 函式外必須為變數賦值,而函式內可以不賦值。 語法 形參和實參前都要加ref關鍵字。         static void

C++ std::vector中push_back操作空間溢位

今天在做leetcode 705、706時候遇到一個錯誤。 題連結:https://leetcode.com/problems/design-hashmap/description/ [817] Design HashMap * * https://leetc

ajax向後臺傳遞list引數

學習記錄:複習 使用ajax向後臺傳遞list引數 前臺 jsp頁面 <button onclick="login222();">測試</button> js function login222() { var l

關於ajax 傳遞引數

ajax 傳送的資料,預設都是字串,不能直接傳遞list(列表),或者dict(字典)。 若要 傳遞list(列表),或者dict(字典),需要進行一些操作。 list 需要進行列表序列化,在ajax下新增引數 tradiction :true dict 若要序列

springmvc傳遞物件引數時讓為空的欄位不傳遞(開發筆記)

引入jar 我這裡用的spring boot 只要引入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-

在jsp頁面的url連結傳遞中文引數的亂碼問題

已知專案中配置如下: strust2裡面,在web.xml檔案配置瞭如下: <filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework

解決前臺URL傳遞中文引數到java後臺亂碼問題

//前端js用encodeURI函式轉換例:var a = encodeURI(encodeURI(name));//後端用URLDecoder類轉換例:String name = request.getParameter("a"); System.out.println("前臺傳入引數:" + name);

檔案上傳的同時傳遞其他引數

FF4中增加了一個很有意思的物件,FormData。通常我們提交(使用submit button)時,會把form中的所有表格元素的name與value組成一個queryString,提交到後臺。這用jQuery的方法來說,就是 serialize。但當我們使用Ajax提交時,這過程就要變成人工的了

postman傳遞list引數給Springboot的controller

                post在raw中選擇,傳遞json格式的資料,資料格式,如下: [ &nbs