成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

因為這7個C++的坑,整個團隊加班一星期

開發 后端
近期我們團隊進行版本質量加固時,踩到了一些比較隱晦的C++的坑,特總結分享在此,供大家參考。

 近期我們團隊進行版本質量加固時,踩到了一些比較隱晦的C++的坑,特總結分享在此,供大家參考。

1. string的字符串拼接,導致coredump

該問題的核心點在于第9行,竟然是可以編譯通過,其原因是x+"-",會被轉成char*,然后與to_string疊加導致BUG。

2. map的迭代器刪除

map要刪除一個元素,通常通過erase()函數來完成,但是要注意,如果我們傳入了一個iterator作為erase的參數來刪除當前迭代器所指向的元素,刪除完成后iterator會失效,產生未定義行為。

正確的使用方法應該是接收erase()的返回值,讓iterator指向被刪除元素的下一個元素或者end()。 

  1. for  ( auto  iter = m.begin(); iter != m.end(); iter++) {  
  2.   if  (...)  
  3.   iter = m.erase(iter);  
  4.   } 

但是上述代碼仍然有錯誤,因為如果觸發了刪除,那么iter再下一輪循環時會指向下下個元素,所以正確的寫法應該是: 

  1. for  ( auto  iter = m.begin(); iter != m.end();) {  
  2.   if  (...) {  
  3.   iter = m.erase(iter);  
  4.   continue ;  
  5.   }  else  {  
  6.   iter++;  
  7.   }  
  8.   } 

3. stringstream的性能問題

  1.  stringstream的清空是clear之后,置空。
  2.  stringstream在任何情況下都比snprintf慢。
  3.  memset是個很慢的函數,寧愿新創建對象。
  4.  上述測試結果是單線程,改成多線程,同樣成立。
  5.  str += “a”, 比 str =str+ “a” 效率高很多,后者會創建新對象。

4. 智能指針(shared_ptr)使用注意

4.1盡量使用make_shared初始化

提高性能 

  1. std::shared_ptr<Widget> spw(newWidget); 

需要分配兩次內存。每個std::shared_ptr都指向一個控制塊,控制塊包含被指向對象的引用計數以及其他東西。這個控制塊的內存是在std::shared_ptr的構造函數中分配的。因此直接使用new,需要一塊內存分配給Widget,還要一塊內存分配給控制塊

 

  1. autospw = std::make_shared<Widget>(); 

一次分配就足夠了。這是因為std::make_shared申請一個單獨的內存塊來同時存放Widget對象和控制塊。這個優化減少了程序的靜態大小,因為代碼只包含一次內存分配的調用,并且這會加快代碼的執行速度,因為內存只分配了一次。另外,使用std::make_shared消除了一些控制塊需要記錄的信息,這樣潛在地減少了程序的總內存占用。

異常安全 

  1. processWidget(std::shared_ptr<Widget>( new  Widget),   //潛在的資源泄露   
  2.   computePriority()); 

上述代碼存在內存泄漏的風險,上述代碼執行分為3個步驟:

  1.  new  Widget

  2. shared_ptr構造

  3. computePriority

編譯器不需要必須產生這樣順序的代碼,但“new Widget”必須在std::shared_ptr的構造函數被調用前執行。如果編譯器產生的順序代碼如下:

  1.  new  Widget

  2. 執行computePriority。

  3. 執行std::shared_ptr的構造函數。

如果執行步驟2:computePriority的時候程序出現異常,則在第一步動態分配的Widget就會泄露了,因為它永遠不會被存放到在第三步才開始管理它的shared_ptr中

4.2 父類之類智能指針轉換

C++中是允許裸指針,因此裸指針之間轉換方法同C語言指針強轉,智能指針轉換不能通過上述方法進行強轉,必須通過庫提供轉換函數進行轉換。C++11的方法是:std::dynamic_pointer_cast;boost中的方法是:boost::dynamic_pointer_cast 

  1. #include <memory>  
  2. #include <boost/shared_ptr.hpp>  
  3. #include <boost/make_shared.hpp>  
  4. #include <iostream>  
  5. class  Base {  
  6.   public :  
  7.   Base(){}  
  8.   virtual  ~Base() {}  
  9. };  
  10. class  D :  public  Base {  
  11.   public :  
  12.   D(){}  
  13.   virtual  ~D() {}  
  14. };  
  15. int  main()  
  16.  

//方式一:先初始化子類智能指針,然后調用dynamic_pointer_cast轉換成基類智能指針對象 

  1. std::shared_ptr<D> d1 = std::make_shared<D>();  
  2. std::shared_ptr<Base> b1 = std::dynamic_pointer_cast<Base>(d1);   

//方式二:先new子類D的指針,然后調用shared_ptr的構造函數初始化基類智能指針 

  1.   std::shared_ptr<Base> b2 = shared_ptr<Base>( new  D());  
  2.   return  0;  

結論

方式一和方式二均能夠實現基類智能指針指向子類,但建議采用方式1,通過std::make_shared的方式構造智能指針,然后進行轉換;

5. map的安全查找辦法

即map[key]這種寫法,就是會創建元素(且不一定初始化),因此在業務邏輯是希望查找的時候,就老老實實用find,不然會有臟數據寫入。

6. string 的指針構造

std::string 的構造方式,除了與其它順序容器相近的方式之外,提供了三種額外的構造方式:

string s(cp, n): s 是cp指向的數組中前n個字符的拷貝,該數組至少應該包含n個字符

string s(s2, pos2):s 是string s2從下標pos2開始的字符的拷貝,若pos2>s2.size(),構造函數的行為未定義

string s(s2, pos2, len2):s 是string s2從下標pos2開始len2個字符的拷貝,若pos2>s2.size(),構造函數的行為未定義。不管len2的值是多少,構造函數至多拷貝s2.size()-pos2個字符

std::string 未提供 string(cp, pos2, len2) 這種構造方式,如果代碼中使用了該方式,最終會將 cp 指向的數組構造成一個string,然后調用string(s2, pos2, len2)這種構造方式。

不提供string(cp, pos2, len2)這種構造方式原因在于:使用這種方式構造容易出現問題,cp是一個指針,通常使用時,能獲得其數組長度并檢查傳入參數;若傳入兩個參數,容易出現越界。

7. 變量初始化

變量初始化總是沒錯的,不管后面是否會修改該值。尤其是int等內建的類型,在類或struct中及容易忽略初始化,使變量成為隨機值,產生不可預知的錯誤。變量請初始化!變量請初始化!!變量請初始化!!! 

 

責任編輯:龐桂玉 來源: Linux公社
相關推薦

2009-04-07 11:17:48

程序員高薪求職

2020-02-20 10:45:51

Python數據疾病

2017-05-28 12:26:58

5GTCPIP

2020-06-12 11:03:22

Python開發工具

2024-04-03 12:30:00

C++開發

2024-06-26 10:37:05

2025-06-13 08:35:00

前向聲明C++代碼

2020-06-11 18:35:23

C++編程語言

2025-06-16 05:10:00

AI工具Galileo

2023-11-22 13:22:51

C++函數

2018-10-09 12:25:00

2021-05-28 18:12:51

C++設計

2018-08-23 11:58:53

區塊鏈數字貨幣比特幣

2025-02-26 00:43:15

LINQC#工具

2020-04-10 15:20:40

數據庫SQL索引

2024-12-24 12:10:00

代碼C++Lambda

2019-10-25 14:00:01

協作遠程IT團隊工具

2011-09-16 10:00:56

C++

2024-05-06 00:00:00

緩存高并發數據

2017-12-01 10:05:59

C++編程開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线观看一区二区 | 一级毛片播放 | 午夜影晥| 亚洲欧美国产精品久久 | 日本一区二区不卡视频 | 三级视频在线观看 | 亚洲天天干| 亚洲一区二区久久 | 日韩h| 在线看片国产精品 | 国产精品久久久久久婷婷天堂 | 亚洲视频在线观看 | 国产高清视频一区 | 欧美在线一区二区三区 | 中文字幕在线免费观看 | 在线观看成人小视频 | 国产 日韩 欧美 中文 在线播放 | 国产精品国产三级国产aⅴ入口 | 毛片免费在线 | 国产精品视频久久久久久 | 欧美日韩一区二区电影 | av网站在线看| 精品亚洲一区二区 | 九一视频在线观看 | 久久综合亚洲 | 国产一区二区三区在线看 | 91在线视频免费观看 | 国产精品久久久 | 国内精品久久久久久久影视简单 | 一区二区三区久久久 | 国产aⅴ| 99久久国产综合精品麻豆 | 亚洲免费毛片 | 国产午夜精品一区二区三区在线观看 | 国产美女视频黄a视频免费 国产精品福利视频 | 午夜欧美a级理论片915影院 | 午夜激情在线 | 日本公妇乱淫xxxⅹ 国产在线不卡 | 天天视频成人 | 午夜免费 | 免费在线观看成年人视频 |