資料介紹
C 及標(biāo)準(zhǔn)庫中,其實存在了一些大坑,你都知道怎么避免嗎?
1、變量初始化
這是使用 C 11 codecvt 時遇到的一個坑,轉(zhuǎn)換編碼時,mbstate_t 這個中間狀態(tài)變量,必須初始化為0,否則運(yùn)行出錯,即:
這是第一個坑,并不算太坑,還比較容易調(diào)試和發(fā)現(xiàn),也怪自己大意了。
經(jīng)驗:C 中的變量一定要初始化后再使用。
2、匿名 std::thread 對象
這個坑要和 boost 進(jìn)行比較,在 boost 中,是可以創(chuàng)建匿名 thread 對象的,并且這樣的匿名對象跟 future、promise是可以正常配合使用的(《Boost標(biāo)準(zhǔn)庫完全開發(fā)指南》一書中的示例代碼就是這樣寫的)。
但是,在 C 標(biāo)準(zhǔn)庫中不能這么干,會出現(xiàn)莫名其妙的錯誤,調(diào)試時也不會顯示任何有價值的信息,最終確定這個問題真是費(fèi)了我好大勁,因為根本沒想到會是這個問題,畢竟 boost 里都正常使用了。
經(jīng)驗:盡量不使用匿名對象,如果想要用完立即釋放,可以使用單獨的代碼塊包裹。
3、線程局部存儲(TLS)
這是一個坑了我一天的大坑。
C 11 中,新引入了 thread_local 存儲類型,等同于之前的 __declspec(thread),由于其具有真正的可移植性,所以我就嘗試使用了,但這也是噩夢的開始。
我有一段代碼,如果編譯為 exe,在 xp 系統(tǒng)上能正常運(yùn)行,但如果編譯為 dll,在 xp 上運(yùn)行就出錯。由于 xp 上不能安裝 VS 這種高科技玩意,只能用 x32_dbg 湊合調(diào)試,發(fā)現(xiàn)是空指針異常,指針來源為 fs:[2c],這是 TLS 指針啊,然后百度,找到了微軟的文檔 :
是的,如果 dll 中使用了 thread_local,這個 dll 將不能在 xp 上通過 LoadLibrary 動態(tài)加載。
解決辦法也是有的:既然不能通過 LoadLibrary 動態(tài)加載,那我靜態(tài)加載不就行了,只要在編譯 exe 時靜態(tài)鏈接 dll,即 dll 在 exe 的導(dǎo)入表中,那就可以正常運(yùn)行(這也要求 exe 必須是自己可編譯的)在 DllMain 中使用 TLS 相關(guān)的 API 手動初始化。
經(jīng)驗:或許我應(yīng)該拋棄 xp 了。
4、dll 中的靜態(tài)對象
這個坑跟上個坑是同時出現(xiàn)的,只是我當(dāng)時用了靜態(tài)鏈接的方式后,就運(yùn)行正常了,也就沒在意。直到后來又想在 C# 中調(diào)用dll,這回沒辦法靜態(tài)鏈接了。為了先實現(xiàn)功能,我選擇了暫時刪除 thread_local,但是在 xp 上依然運(yùn)行出錯,錯誤原因跟之前一樣!臥槽,我特么明明都刪掉了 thread_local 呀,為何還這樣!!
又經(jīng)過2個小時的調(diào)試,最終確定問題出在 C 17 標(biāo)準(zhǔn)庫中的 std::experimental::filesystem::exists() 函數(shù),但是經(jīng)過我單步調(diào)試發(fā)現(xiàn),這個函數(shù)并沒有使用 TLS,只用到了一些全局靜態(tài)對象,莫非是全局靜態(tài)對象的問題?
于是還是找文檔吧,跟上個問題同一個網(wǎng)址 :
在 C 11 中,靜態(tài)變量的初始化是線程安全的,這個所謂的“線程安全”,就是引入了 TLS 來進(jìn)行一些額外的檢查,好在這個特性是可以禁用的,編譯時添加 /Zc:threadSafeInit- 選項即可(注意最后的減號),禁用后就不會使用 TLS 了,也就可以在xp 上動態(tài)加載了。
注:這些問題在 VS2015 Update 2 中發(fā)現(xiàn),應(yīng)該也會持續(xù)存在于之后的 VS 版本中。
來源:網(wǎng)絡(luò)(版權(quán)歸原作者所有)
(mbbeetchina)
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 電阻的噪聲主要分為兩類,你都知道嗎?資料下載
- 熱電偶基本定律有四個,你都知道是哪些嗎?資料下載
- 這兩種短路保護(hù)的方式你都知道嗎?怎么運(yùn)用?資料下載
- 常用電子元器件的分類,你都知道嗎資料下載
- STM32 經(jīng)驗總結(jié),這些你都知道嗎資料下載
- 熱敏電阻的四種常見作用,你都知道嗎資料下載
- 常用電感,這些你都知道嗎資料下載
- C++開源庫的詳細(xì)資料合集免費(fèi)下載
- C++的框架、庫和資源資料匯總大全
- C++的開源庫大全詳細(xì)資料說明
- C++的框架、庫和代碼分析的資料大全
- Visual C++教程之C++的語言資料概述免費(fèi)下載 3次下載
- C++容器的使用代碼資料總結(jié)免費(fèi)下載 2次下載
- C++的一些試題資料總結(jié)免費(fèi)下載 6次下載
- c++標(biāo)準(zhǔn)庫手冊 43次下載
- 基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:SafeMap 130次閱讀
- 基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:SafeQueue 103次閱讀
- 基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:SafeStack 97次閱讀
- 基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:SafeBlockQueue 116次閱讀
- OpenHarmony標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫案例:HelloWorld 220次閱讀
- C++中實現(xiàn)類似instanceof的方法 335次閱讀
- 使用 MISRA C++:2023? 避免基于范圍的 for 循環(huán)中的錯誤 485次閱讀
- C++簡史:C++是如何開始的 415次閱讀
- C語言和C++中那些不同的地方 748次閱讀
- 使用C++編寫通用庫并在 Rust 中使用它 (WASI) 893次閱讀
- C++ STL基本概念是什么 1222次閱讀
- Linux操作系統(tǒng)知識講解:避免內(nèi)存使用七大坑 2737次閱讀
- C++三大特性:封裝的概念原理 6359次閱讀
- 基于STM32F4的 C++封裝(完整代碼) 9553次閱讀
- 詳細(xì)剖析C++的的3種容器 4822次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評論
查看更多