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 的區別
- new和malloc的區別
- new 和 malloc 的區別 及使用
- malloc/free 和 new /delete 的區別 (轉)delete
- PHP new self()和new static()的區別PHP
- 細說new和malloc的十大區別
- malloc free與new delete的區別和聯絡delete
- C++ new A 和 new A() 的區別詳解C++
- JavaScript中的new map()和new set()使用詳細(new map()和new set()的區別)JavaScript
- Golang make和new的區別Golang
- new/delete 和malloc/free 的區別一般彙總delete
- __new__和__init__的區別
- newInstance和new的區別(good)Go
- C++中new與malloc的10點區別C++
- 記憶體動態分配與釋放,malloc和new區別記憶體
- __new()__ 與 __init()__的區別
- Python __new__ 和 __init__ 的區別Python
- 【C++】C++用new和不用new建立類物件區別C++物件
- 【JAVA】Class.forName用法以及和new的區別Java
- C/C++——C++中new與malloc的10點區別C++
- PHP中new static()與new self()的區別異同分析PHP
- Go 語言 new 和 make 關鍵字的區別Go
- new和malloc的地址分配問題
- PHP中 new clone __clone區別PHP
- 【學習筆記】make 和 new 關鍵字的區別筆記
- Golang make和new的區別及實現原理詳解Golang
- Python面試之理解__new__和__init__的區別Python面試
- 構造器引用和直接用new建立物件區別物件
- Python中__new__和__init__的區別與聯絡Python
- String s = “hello“和String s = new String(“hello“)的區別
- Go 中 make 與 new 的區別是什麼?Go
- go語言中make和new有什麼作用以及區別?Go
- 面試官:Golang 的 new 與make 區別是什麼?面試Golang
- iOS 初始化方法 alloc init 與 new 的區別iOS
- C++ 記憶體分配(new,operator new)詳解C++記憶體
- malloc、calloc和realloc區別
- 理解new和實現一個new
- AT NEW 和AT END OF的用法