c++模組間傳遞引數的一些經驗教訓
最近在開發一套新產品,測試中發現了一些UI奔潰,自己在設計模組通訊介面方面考慮不周全,在此做一下記錄。
需求:
兩個模組,UI排程模組以及實際功能模組。UI排程模組需要呼叫功能模組,獲取資料,顯示在UI上面。
//
之前的做法:
1.在功能模組,資料放在一個全域性的list或者vector中,匯出list或vector指標,供UI排程模組使用。
2.UI排程模組,提供一個全域性指標用於存放傳遞過來的資料.
導致的問題:
UI排程模組頻繁排程功能模組,功能模組裡面的資料,增加或者刪除,排程模組存放的資料就會亂,這樣就會導致訪問越界等問題,程式奔潰。
歸根到底,還是資料的同步問題沒有做好。
//
//
現在的做法:
1.list或者vector記憶體的申請以及釋放,統一由UI排程模組提供。功能模組只填充資料,接口裡提供UI呼叫模組list或者vector的指標即可。
2.UI排程模組,在所有增加或刪除資料的地方,加鎖。
這樣再怎麼重複呼叫,怎麼重新整理都不會異常了
//
//@2017.7.26
繼續跟新,這樣呼叫在相同的編輯器下,是可以的。但是如果功能模組使用vs2017開發的,ui排程模組使用的vs2010,就會導致堆疊異常。
終極解決方案:
不使用list或者vector傳參,改為陣列指標即可,內部用list或者vector實現。
分析:
list或者vector,都是模板,不同的編譯器,內部實現應該有所差距。比如vs2010對C11支援的不是很好,智慧指標,std::thread,陣列的預設構造,都不支援。
擴充套件:
設計匯出介面時,不使用模板類,比如string、cstring、vector、list等等,使用基本型別,比如wchar_t*,陣列指標等等,這樣相容性更好。