---
# System prepended metadata

title: c++ 編成  筆記

---

**內存洩漏:**
     當指標指向空指針時，嘗試對他去進行賦值，將會導致內存洩漏。
     舉例:
```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的功能 。




