1. 程式人生 > >一些關於VC++開發的筆記

一些關於VC++開發的筆記

efi pen fine tex def 死循環 parent ras 是否

通常程序卡住了,主要有雙方面的可能:

(1)死循環了
(2)死鎖了
要確定是否是死循環。能夠通過調試器(經常使用Windbg)查看線程執行時間,假設隔了一段會兒兩次查看的執行時間有非常大區別,那麽非常有可能是死循環了。反之,可能是死鎖了。這時候能夠看一下堆棧最上幀是不是在調用相似WaitForSingleObject或者WaitForMultiObject之類的函數。假設線程非常多,僅僅能逐步排查那些線程在等哪些鎖。

關於容器的刪除操作

vector,list,map都能夠通過erase函數刪除元素。

erase(it++)的方式不能用於vector。vector須要通過it = erase(it)的方式刪除,erase會返回被刪除的最後一個元素的叠代器。
而鏈式結構的list和map能夠使用erase(it++)方式刪除。這是由於參數的++處理操作優先於函數調用,所以it會在erase之前先變成下一個叠代器。當然it = erase(it)也是能夠的,兩種方式等價

將計數與new出來的內存聯系在一起,這就是shared_ptr的本質。

在使用的時候。不須要自己顯式控制計數加減。而是通過shared_ptr內部進行計數。我們自己全然能夠通過這樣的思路實現shared_ptr。
多線程環境下,智能指針在讀的時候,能夠通過推斷引用計數來推斷其它地方是否在占用該對象。


Copy_On_Write–Refer_On_Read:寫的時候又一次拷貝一份。讀的時候引用一下。智能指針在寫的時候,假設有人在占用這個內存。reset一下。相當於把引用計數減一,然後又一次開辟一段內存區域拷貝原來的內容,在這裏面進行寫。

讀的時候,引用一次這個指針。計數加1。

這樣進行讀占用的地方就還是使用原來的內存,而使用完成之後,引用計數減1,會釋放這段內存。

這樣當前使用的是曾經的內存。以後真正訪問的是新開辟的內存。妙!!!

文件編譯時存在未聲明/定義或文件未包括的情況

有時候明明感覺是包括了,檢查了一遍又一遍。卻還是不知道哪裏問題。

這時候能夠加編譯選項CommandLine /P,能夠生成.i文件,將包括的整個文件關系顯示出來。通常可能是包括順序問題,或者define/undefine了某個宏導致的問題

‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); });

    一些關於VC++開發的筆記