重囗另类BBWSeⅹHD,av狼论坛,精品一卡2卡三卡4卡乱码理论,体育生gv老师浪小辉3p警察

New delete 與malloc free 的聯(lián)系與區(qū)別

時(shí)間:2024-09-21 04:38:42 資料大全 我要投稿
  • 相關(guān)推薦

New delete 與malloc free 的聯(lián)系與區(qū)別

  答案:都是在堆(heap)上進(jìn)行動(dòng)態(tài)的內(nèi)存操作,

New delete 與malloc free 的聯(lián)系與區(qū)別

。用malloc函數(shù)需要指定內(nèi)存分配的字節(jié)數(shù)并且不能初始化對象,new 會(huì)自動(dòng)調(diào)用對象的構(gòu)造函數(shù)。delete 會(huì)調(diào)用對象的destructor,而free 不會(huì)調(diào)用對象的destructor.

  拓展:

  在 C++ 中,你也許經(jīng)常使用 new 和 delete 來動(dòng)態(tài)申請和釋放內(nèi)存,但你可曾想過以下問題呢?

  new 和 delete 是函數(shù)嗎?

  new [] 和 delete [] 又是什么?什么時(shí)候用它們?

  你知道 operator new 和 operator delete 嗎?

  為什么 new [] 出來的數(shù)組有時(shí)可以用 delete 釋放有時(shí)又不行?

  …

  如果你對這些問題都有疑問的話,不妨看看我這篇文章。

  new 和 delete 到底是什么?

  如果找工作的同學(xué)看一些面試的書,我相信都會(huì)遇到這樣的題:sizeof 不是函數(shù),然后舉出一堆的理由來證明 sizeof 不是函數(shù)。在這里,和 sizeof 類似,new 和 delete 也不是函數(shù),它們都是 C++ 定義的關(guān)鍵字,通過特定的語法可以組成表達(dá)式。和 sizeof 不同的是,sizeof 在編譯時(shí)候就可以確定其返回值,new 和 delete 背后的機(jī)制則比較復(fù)雜。

  繼續(xù)往下之前,請你想想你認(rèn)為 new 應(yīng)該要做些什么?也許你第一反應(yīng)是,new 不就和 C 語言中的 malloc 函數(shù)一樣嘛,就用來動(dòng)態(tài)申請空間的。你答對了一半,看看下面語句:

  string *ps = new string("hello world");

  你就可以看出 new 和 malloc 還是有點(diǎn)不同的,malloc 申請完空間之后不會(huì)對內(nèi)存進(jìn)行必要的初始化,而 new 可以。所以 new expression 背后要做的事情不是你想象的那么簡單。在我用實(shí)例來解釋 new 背后的機(jī)制之前,你需要知道 operator new 和 operator delete 是什么玩意,

資料共享平臺(tái)

New delete 與malloc free 的聯(lián)系與區(qū)別》(http://www.ipr-jzsc.com)。

  operator new 和 operator delete

  這兩個(gè)其實(shí)是 C++ 語言標(biāo)準(zhǔn)庫的庫函數(shù),原型分別如下:

  void *operator new(size_t); //allocate an object

  void *operator delete(void *); //free an object

  void *operator new[](size_t); //allocate an array

  void *operator delete[](void *); //free an array

  后面兩個(gè)你可以先不看,后面再介紹。前面兩個(gè)均是 C++ 標(biāo)準(zhǔn)庫函數(shù),你可能會(huì)覺得這是函數(shù)嗎?請不要懷疑,這就是函數(shù)!C++ Primer 一書上說這不是重載 new 和 delete 表達(dá)式(如 operator= 就是重載 = 操作符),因?yàn)?new 和 delete 是不允許重載的。但我還沒搞清楚為什么要用 operator new 和 operator delete 來命名,比較費(fèi)解。我們只要知道它們的意思就可以了,這兩個(gè)函數(shù)和 C 語言中的 malloc 和 free 函數(shù)有點(diǎn)像了,都是用來申請和釋放內(nèi)存的,并且 operator new 申請內(nèi)存之后不對內(nèi)存進(jìn)行初始化,直接返回申請內(nèi)存的指針。

  我們可以直接在我們的程序中使用這幾個(gè)函數(shù)。

  new 和 delete 背后機(jī)制

  知道上面兩個(gè)函數(shù)之后,我們用一個(gè)實(shí)例來解釋 new 和 delete 背后的機(jī)制:

  我們不用簡單的 C++ 內(nèi)置類型來舉例,使用復(fù)雜一點(diǎn)的類類型,定義一個(gè)類 A:

  class A

  {

  public:

  A(int v) : var(v)

  {

  fopen_s(&file, "test", "r");

  }

  ~A()

  {

  fclose(file);

  }

  private:

  int var;

  FILE *file;

  };

  很簡單,類 A 中有兩個(gè)私有成員,有一個(gè)構(gòu)造函數(shù)和一個(gè)析構(gòu)函數(shù),構(gòu)造函數(shù)中初始化私有變量 var 以及打開一個(gè)文件,析構(gòu)函數(shù)關(guān)閉打開的文件。

  我們使用

【New delete 與malloc free 的聯(lián)系與區(qū)別】相關(guān)文章:

勞動(dòng)合同與就業(yè)協(xié)議書的區(qū)別聯(lián)系10-31

一個(gè)標(biāo)準(zhǔn)的外商聯(lián)系函格式03-13

第一志愿和平行志愿的區(qū)別03-28

平行志愿和非平行志愿的區(qū)別和對比06-15

主站蜘蛛池模板: 肥城市| 祥云县| 墨玉县| 绥宁县| 张掖市| 建昌县| 涪陵区| 永定县| 民乐县| 苏尼特右旗| 宿松县| 乐平市| 论坛| 合山市| 宁城县| 吉安市| 师宗县| 黎川县| 黑水县| 玛曲县| 庄河市| 阜阳市| 台北县| 永丰县| 颍上县| 塘沽区| 新绛县| 安远县| 大悟县| 冷水江市| 儋州市| 石河子市| 晋州市| 邻水| 贵港市| 屏山县| 琼海市| 锡林浩特市| 齐齐哈尔市| 洱源县| 平远县|