# [我所不知道的C語言] Null
###### tags: `C` `C++`
:::success
:smile: 標題取自於靈感取自於線上講座 - [你所不知道的 C 語言](https://hackmd.io/@sysprog/c-programming?type=view)
:::
## Null and `free`/`delete`
在有GC語言特性的程式語言中,如: C#、Java、Golang,若要清空一個變數的值,會類似這樣寫法:
```csharp=
MyClass name = new MyClass();
name = null;
```
指派為`Null`之後,接下來就交給GC去檢查還有沒有去使用這個變數了,但C與C++不一樣,如果動態配置的記憶體,釋放過後只是告訴電腦「我把這個記憶體還給OS了」,而於本處存記憶體位置的變數會是「未定義」的,所以,有一個Best Practice是當釋放記憶體之後,把變數設為null,方便後續要對改變數作處理:
```c=
// C
int* i = malloc(sizeof(int));
*i = 100;
free(i);
i = NULL;
// C++11
int* i = new int();
*i = 100;
delete i;
i = nullptr;
```
還有,在釋放記憶體後,並指派為null的這件事可以避免同一個記憶體重複事後兩次的執行期錯誤:
```c=
int* i = malloc(sizeof(int));
free(i);
i = NULL;
free(i);
// No exception in run-time
```
## Reference
- [stackoverflow - Setting variable to NULL after free
](https://stackoverflow.com/questions/1025589/setting-variable-to-null-after-free)