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,會出現這個問題(
問題產生的原因是:
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 _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