**內存洩漏:** 當指標指向空指針時,嘗試對他去進行賦值,將會導致內存洩漏。 舉例: ```cpp char * save = nullptr; *save = 3; //把3寫入到nullptr所在的記憶體位置,將會導致內存洩漏。 strcpy(save,xm.c_str()); 嘗試將xm.c_str()複製到nullptr,也會發生內存洩漏。 ``` **gdb調適運行中程式的方法:** 首先要知道進程號 ``` ps -f ``` 接下來通過以下指令,則可調試進行中的程式 ``` gdb <程式名> -p <進程號> ``` 被調試的程式會自動停止 由 malloc 分配的記憶體 使用 free 來釋放 由 new 分配的記憶體 使用 delete 來釋放 可以通過 access 函數判斷文件是否存在 ``` access(argv[1],F_OK)!=0; 則為不存在 ``` system 函數 也是通過創建子進程,並通過execl執行程式。 如果父進程比子進程還要先退出,則子進程會給1號進程託管,也就是後台進行運行, 如果子進程比父進程還要早退出,而父進程沒有處理子進程的退出,此時子進程的資料會被保存在內核當中,進程編號會被占用,又被稱為殭屍進程。 **網路編程** socket()函數也是一種文件描述符。 常用協議為IPv4協議,其中的TCP或UDP TCP優點是穩不易丟失 UDP優點是快但會丟失。 網路協議規定用大端序做共同協議 也就是 記憶體 高位對高位 低位對低位。 ![image](https://hackmd.io/_uploads/S1P5FSjHC.png) **記憶體** 動態分配的內存會存在heap區,而局部變量會和程序一起存在stack區中,全局變量則會儲存在數據區當中。 **socket網路通訊流程** **服務端:** 需輸入端口號,藉著通過socket函數創建網路描述符IPv4 or IPv6 之類的通信協議設定 TCP UDP...(類似文件描述符),將ip號和端口號通過bind函數綁到網路描述符上,接著通過listen 函數監聽網路描述符,當內核通過三次握手後,會將網路描述符丟到一個對列,這時候通過accept函數讀取隊列,能獲得第二個網路描述符,通過著個網路描述符,能使用while迴圈不斷使用recv函數讀取(我猜這裏可以用epoll優化)客戶端數據,使用send傳送給客戶端應答,當recv輸出為0時,代表通訊中斷,關閉網路描述符即可。 服務端流程: 端口號 -> socket -> bind -> listen ->accept() ->recv ()and send () **客戶端:** ![image](https://hackmd.io/_uploads/HkqDOTKUA.png) 需傳入服務端ip和端口號,同樣通過socket函數設定網路相關協議,不需要bind函數,而是直接將端口號和ip通過結構體傳遞到connect函數,這時就會與服務端通過三次握手建立通訊,同樣通過send傳遞數據,recv進行接收,關閉網路描述符 則終止通訊。 服務端 ip和端口 -> socket -> connect() -> recv() and send() read 在某些情況下能做到recv 的功能,write也是某些情況下能做到send的功能 。