近來一篇<The Dark Side Of C++>在坊間廣為轉載,作為一個以C++為吃飯傢伙的程式員,還是應該下載下來好好讀一讀的。 總的來講還是總結的蠻全的,由於個人知識的限制,我讀完後將其分為三類:一類是我不以為然的,覺得算不上陰暗面;一類是深有同感,深受其害;而另外一類則是還不理解,需要日後有時間的時候加以研究的。
一、不以為然
- 不斷變更的標準,迫使我們需要不斷更新已有代碼。
作者列出了幾點其實影響並不是很大(迴圈變數的scope;標頭檔尾碼;名字空間)。而且,為了標準的進步,偶爾做出的妥協也是應該的吧。
- 不斷變更的style,作者舉得例子是:Old and busted:
for (int i = 0; i < n; i++)
New hotness:
for (int i(0); i != n; ++i) 有這個問題嗎?有人用第二種方式的嗎?
- auto_ptr很爛。
這個,你不用它就是了,而且最近在智能指標加入C++0x大家庭後,應該達成共識了吧
- iterator可能會失效。
這個我感覺還好,沒遇到過太多問題;
- iterator對container毫不知情。
我覺得這是STL設計的一個優點吧,通過iterator解耦演算法與容器。
- vector::at會做邊界檢查,而operator []不會。
很好啊,提供兩種選擇
- 建構函式與解構函式中的虛函數調用,可能會調用基類的虛函數,甚至是純虛函數。
這個不怎麼陰暗吧,不要在建構函式與解構函式總調用虛函數應該是個常識,而且,其他語言難道沒有這個問題?
二、深有同感
三、日後研究
- 關於名字空間,C++有過什麼大的更改嗎?
這個估計要查查《C++語言的設計與演化》了
- 用C++寫出好的庫基本是不可能的。
我看到很多人,包括牛人都說過這個,但是不知有沒有給過一個列表,C++中那些缺點使其寫出好的庫成為不可能,哪些語言可以,為什嗎?
- 我們不應該在建構函式中拋出異常,因為:Exceptions in constructor don’t unwind the constructor itself。
這個不太理解,據我所知,在建構函式中拋出異常是建構函式報錯的一個方法,因為建構函式本身不返回任何值。
- 拋出異常時:Does not even clean up local variables!
不理解,我們的RAII不就是利用local對象的析構來做記憶體管理的嗎。
- assert(s[s.size()] == 0); works if s is a const std::string, butis undefined if it is not const
在VC2008上試了一下,沒問題。為什麼會這麼說,為什嗎?
- If you call delete when you should have called delete[], the pointer wilbe off by sizeof(int), leading to heap corruption and possibly code execution.
不懂。
- If you call delete[] when you should have called delete, some randomdestructors will be called on garbage data, probably leading to code execution.
為什麼,delete[]會去計算該數組中有幾個元素,而答案應該是1,那就不該有問題 - 這個可能和上一點的答案有關。