new 和 malloc 的區別 及使用
定義上:malloc memory allocation 動態記憶體分配 是c中的一個函式
使用方法:
extern void *malloc(unsigned int num_bytes)
extern void *malloc(unsigned int num_bytes)
um_bytes記憶體塊位元組長度。
記憶體塊大小確定:malloc是透過我們計算然後得到一塊新記憶體,然後指定資料型別並且記憶體值也是隨機的。
使用時:需要引入標頭檔案庫函式 stdlib.h 或是 malloc.h(malloc.h與alloc.h一致)。
記憶體分配位置:堆中動態分配的記憶體。
具體分配過程:由程式向作業系統申請,作業系統遍歷空閒結點連結串列,將第一個大於申請空間的堆結點分配給程式,然後將空閒結點連結串列中此節點刪掉。
成功分配:返回值為指向被分配記憶體的指標。
失敗分配:返回值為空NULL。
返回型別:void* (未確定型別的指標)。
void*型別可以透過強制型別轉換轉換為任意其他型別(因為使用者儲存資料型別未知,由使用者決定資料型別)。
記憶體塊釋放:free()函式 將記憶體還給程式或作業系統。
注意:malloc與free都屬於c/c++標準庫函式,在使用時應該配對 申請之後不釋放就會有可能發生記憶體洩漏。
使用free時需要檢查指標是否為空。
ew 是c++中的運算子(其地位等同於“+”,“=”)。
在使用:new時不止分配記憶體,還會進行初始化,執行相應建構函式,初始化時需要指定資料型別。
記憶體分配位置:自由儲存區為物件分配記憶體。
使用時:無需引入標頭檔案,new是保留字。
ew 和 delete 是配對使用的。
在使用delete時注意將指標置為0,否則會形成懸垂指標(指標所指記憶體已被釋放,仍指向該記憶體),造成錯誤。
ew 可以看做是malloc 加 建構函式的執行,就是new更高階一些。
ew的幾種用法:
1 int *p=new int; //在自由儲存區開闢一個int變數 2 int *p=new int[10];//在自由儲存區開闢一個int陣列,有10個元素 3 int *p=new int(10);//在自由儲存區開闢一個int變數,並初始化為10
釋放記憶體時無需檢查是否為空。
如果p等於NULL,則delete p不作任何事情。由於之後可以得到測試,並且大多數的測試方法論都強制顯式測試每個分支點,因此你不應該加上多餘的 if 測試。
錯誤的:
1 if (p != NULL) 2 delete p; 3正確的:delete
面試時可能會問到的問題:
1)它們都可用於申請動態記憶體和釋放記憶體。
2)malloc是庫函式只能作用於內部資料型別,對於非內部資料動態物件而言,就不能完成物件的初始化與銷燬,即執行建構函式與解構函式,而new 與 delete此類運算子就能夠在編譯器的控制許可權內完成,物件的初始化與銷燬任務,即執行建構函式與解構函式。
既然new/delete的功能完全覆蓋了malloc/free,為什麼C++不把malloc/free淘汰出局呢?這是因為C++程式經常要呼叫C函式,而C程式只能用malloc/free管理動態記憶體。
我們不要企圖用malloc/free來完成動態物件的記憶體管理,應該用new/delete。由於內部資料型別的“物件”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。
注意:如果用free釋放“new建立的動態物件”,那麼該物件因無法執行解構函式而可能導致程式出錯。
如果用delete釋放“malloc申請的動態記憶體”,結果也會導致程式出錯,但是該程式的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。
零值指標,是值是0的指標,可以是任何一種指標型別,可以是通用變體型別void*也可以是char*,int*等等。 空指標,其實空指標只是一種程式設計概念,就如一個容器可能有空和非空兩種基本狀態,而在非空時可能裡面儲存了一個數值是0,因此空指標是人為認為的指標不提供任何地址訊息。
記憶體洩漏對於malloc或者new都可以檢查出來的,區別在於new可以指明是那個檔案的那一行,而malloc沒有這些資訊。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543790/viewspace-2222404/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 細說new和malloc的十大區別
- malloc、calloc和realloc區別
- JavaScript中的new map()和new set()使用詳細(new map()和new set()的區別)JavaScript
- PHP new self()和new static()的區別PHP
- Golang make和new的區別Golang
- Golang make和new的區別及實現原理詳解Golang
- Python __new__ 和 __init__ 的區別Python
- C malloc() free(), C++ new() delete()C++delete
- localStorage,sessionStorage和cookie的區別及使用SessionCookie
- __new()__ 與 __init()__的區別
- 【C++】C++ new和malloc到底哪裡不一樣C++
- String s = “hello“和String s = new String(“hello“)的區別
- Go 語言 new 和 make 關鍵字的區別Go
- SurfaceView和普通view的區別及簡單使用View
- Python中__new__和__init__的區別與聯絡Python
- 【學習筆記】make 和 new 關鍵字的區別筆記
- Python面試之理解__new__和__init__的區別Python面試
- 構造器引用和直接用new建立物件區別物件
- 記憶體分配詳解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc記憶體
- 使用jquery和使用框架的區別jQuery框架
- npm 和 yarn 的使用區別NPMYarn
- WebGL和OpenGL的區別及關係Web
- Go 中 make 與 new 的區別是什麼?Go
- go語言中make和new有什麼作用以及區別?Go
- 2020 blur()和onblur的使用區別
- Python中eval與exec的使用及區別Python
- TCP和UDP的優缺點及區別TCPUDP
- Timer和ScheduledThreadPoolExecutor的區別及原始碼分析thread原始碼
- 關於Fork和Malloc的思考
- BeautifulSoup和etree的區別和使用場景
- YII 的 with 與 joinwith 的區別和使用
- js--typeof 和 instanceof 判斷資料型別的區別及開發中的使用JS資料型別
- CountDownLatch和CyclicBarrier區別及詳解CountDownLatch
- Linux中&&和&,|和||用法及區別詳解!Linux
- javascript原始值和引用值型別及區別JavaScript型別
- apply 、call 以及 bind 的使用和區別APP
- ../和./和/的區別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別