malloc和new的區別,new和operator new的區別,分配器介紹
首先先解釋幾個概念:
分配空間和初始化:分配空間只是在記憶體上劃定一片區域作為已分配空間使用,但是該空間上的值是未知的;而初始化則是對空間進行了賦值過程,也就是已經可以正常使用了。
malloc和new:
從本質上來說,malloc只是分配空間,不進行任何初始化,記憶體空間上的值是未知的,而new則是分配完空間,同時在該分配完的控制元件上進行初始化,也就是呼叫建構函式,所以malloc出來的空間,你還要在上面賦值才能當成你想要的型別來使用。
從使用方法上,malloc返回的是void*指標,所以你必須進行強制轉換才能把分配出來的空間的首地址指標賦給新指標,例如char *p = (char *)malloc( sizeof(char) * 5); 而new就不需要了,直接A *p = new A(type); 其中的type是建構函式的輸入引數,可以隨意選擇一個建構函式,若無可以省略。同時,malloc的輸入引數必須是位元組數,例子中用到了sizeof。
所以malloc和new就體現了文章開頭提到的分配空間和初始化的問題。
分配器介紹:
在C++中,有一個類:allocator類,是C++的一個模板,它提供型別化的記憶體分配以及物件的分配和撤銷。allocator類將物件分配和物件構造分開。這裡的物件分配和物件構造當然也是上文提到的分配和初始化啦。
allocator<T> a;
所以,allocator有兩個相應的操作,a.allocate(n):分配n個T物件的空間;a.construct(p, t):在T* p指標所指的記憶體空間,執行復制建構函式用t對p指向物件其進行初始化。當然,析構a.destroy(p)和釋放記憶體a.deallocate(p, n)則是相反的操作,deallocate是釋放p開頭的n個T物件的空間。
new和operator new:
new是表示式,而operator new則是函式。
operator new是C++中另外一種原始記憶體的分配方法,用它可以分配未型別化的空間,new運算子和malloc基本是等同的;但C++允許你通過過載的方式自行擴充套件,使得new運算子背後完成的工作任意複雜——只要最後它能給出合適大小、可讀寫的記憶體就行。
new的操作相當於呼叫operator new分配空間 + construct + 返回物件指標。
相關文章
- new 和 malloc 的區別 及使用
- PHP new self()和new static()的區別PHP
- 細說new和malloc的十大區別
- JavaScript中的new map()和new set()使用詳細(new map()和new set()的區別)JavaScript
- Golang make和new的區別Golang
- Python __new__ 和 __init__ 的區別Python
- __new()__ 與 __init()__的區別
- String s = “hello“和String s = new String(“hello“)的區別
- Go 語言 new 和 make 關鍵字的區別Go
- Python中__new__和__init__的區別與聯絡Python
- 【學習筆記】make 和 new 關鍵字的區別筆記
- Python面試之理解__new__和__init__的區別Python面試
- Golang make和new的區別及實現原理詳解Golang
- 構造器引用和直接用new建立物件區別物件
- Go 中 make 與 new 的區別是什麼?Go
- go語言中make和new有什麼作用以及區別?Go
- 理解new和實現一個new
- 面試官:Golang 的 new 與make 區別是什麼?面試Golang
- malloc、calloc和realloc區別
- PHP 的 new static 和 new self 具體有什麼?PHP
- C malloc() free(), C++ new() delete()C++delete
- Python語言中__init__與__new__的區別是什麼?Python
- 【C++】C++ new和malloc到底哪裡不一樣C++
- 一句話說明白C#中的new與override的區別C#IDE
- FTP和TFTP的區別與介紹FTP
- ssr、ss和vpn介紹和區別
- new self()與new static()
- new static ,new self ,self::, $this的一些理解
- jar包和war包的介紹與區別JAR
- New
- <七>深入理解new和delete的原理delete
- NTFS和FAT32區別介紹
- 記憶體分配詳解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc記憶體
- gpu是什麼 gpu和cpu的區別介紹GPU
- PHP 中 include 和 require 的概要及區別介紹PHPUI
- cpu散片和盒裝的區別是什麼 amdintelcpu散片和盒裝區別介紹Intel
- Object.create(..)和new(..)的內部實現Object
- javascript的call apply和new原理剖析 [手寫]JavaScriptAPP
- Java 中的 clone( ) 和 new,哪個效率更高?Java