[c++] new / delete和malloc / free有什麼區別?


Answers

最相關的區別是new操作符分配內存然後調用構造函數,並delete調用析構函數然後釋放內存。

Question

new / deletemalloc / free什麼區別?

相關(重複?): 我在哪些情況下使用malloc vs new?




  • new是一個運算符,而malloc()是一個函數。
  • new返回確切的數據類型,而malloc()返回void *(void類型的指針)。
  • malloc(),內存沒有初始化,默認值是垃圾,而在新的情況下,內存使用默認值進行初始化,就像int中的“零(0)”一樣。
  • delete和free()都可以用於'NULL'指針。



唯一的相似之處是malloc / new都返回一個指向堆中某個內存的指針,並且它們都保證一旦這樣的內存塊被返回,它就不會被再次返回,除非你先釋放/刪除它。 也就是說,他們都“分配”內存。

但是, new / delete可以通過構造函數,析構函數和運算符重載來執行任意其他工作。 malloc / free只能分配和釋放內存。

實際上, new有足夠的可定制性,它不一定會從堆中返回內存,甚至根本不需要分配內存。 然而,默認的new功能。




在C ++中, new / delete調用Constructor / Destructor。

malloc / free只需從堆中分配內存。 new / delete分配內存。




newdelete是C ++ 基元 ,它聲明一個新的類的實例或刪除它(因此調用實例的類的析構函數)。

mallocfree是C 函數 ,它們分配和釋放內存塊(大小)。

兩者都使用堆來進行分配。 mallocfree是更“低級”的,因為它們只保留了一塊可能與指針相關的內存空間。 在內存周圍不會創建任何結構(除非您將C數組視為結構)。




new和malloc之間的主要區別在於new調用對象的構造函數,相應的delete調用調用對象的析構函數。

還有其他區別:

  • new是類型安全的, malloc返回void*類型的對象

  • new在錯誤時拋出異常, malloc返回NULL並設置errno

  • new是一個運算符,可以重載, malloc是一個函數,不能重載

  • new[]分配數組,比malloc更直觀,更安全

  • malloc派生的分配可以通過realloc調整大小, new派生的分配不能調整大小

  • malloc可以分配一個N字節的內存塊, new必須被要求分配一個char類型的數組

看看這些差異,一個總結是malloc是C-esque,新是C ++ - esque。 使用適合你的代碼庫的那個。

雖然使用不同的內存分配算法來實現new和malloc是合法的,但在大多數係統中,新內部使用malloc在內部實現,不產生系統級差異。




此代碼使用delete關鍵字或免費功能。 但是,當使用'malloc'或'new'創建指針對象並使用delete刪除對象內存時,即使該對象指針可以是類中的調用函數。 之後,使用免費而不是刪除,然後它也適用於免費的語句後,但是當使用兩個,然後只有指針對像不能調用類中的函數..代碼如下:

#include<iostream>


using namespace std;

class ABC{
public: ABC(){
    cout<<"Hello"<<endl;
  }

  void disp(){
    cout<<"Hi\n";
  }

};

int main(){

ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();

cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}

輸出:

Hello
Hi
0x2abfef37cc20



Related