一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

我的家鄉作文該怎么寫(xiě)

時(shí)間:2025-12-15 09:53:51 家鄉 我要投稿

我的家鄉作文該怎么寫(xiě)

  答案:都是在堆(heap)上進(jìn)行動(dòng)態(tài)的內存操作。用malloc函數需要指定內存分配的字節數并且不能初始化對象,new 會(huì )自動(dòng)調用對象的構造函數。delete 會(huì )調用對象的destructor,而free 不會(huì )調用對象的destructor.

我的家鄉作文該怎么寫(xiě)

  拓展:

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

  new 和 delete 是函數嗎?

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

  你知道 operator new 和 operator delete 嗎?

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

  …

  如果你對這些問(wèn)題都有疑問(wèn)的話(huà),不妨看看我這篇文章。

  new 和 delete 到底是什么?

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

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

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

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

  operator new 和 operator delete

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

  void *operator new(size_t); /pic/p>

  void *operator delete(void *); /pic/p>

  void *operator new[](size_t); /pic/p>

  void *operator delete[](void *); /pic/p>

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

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

  new 和 delete 背后機制

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

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

  class A

  {

  public:

  A(int v) : var(v)

  {

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

  }

  ~A()

  {

  fclose(file);

  }

  private:

  int var;

  FILE *file;

  };

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

  我們使用

  class *pA = new A(10);

  來(lái)創(chuàng )建一個(gè)類(lèi)的對象,返回其指針 pA。如下圖所示 new 背后完成的工作:

  簡(jiǎn)單總結一下:

  首先需要調用上面提到的 operator new 標準庫函數,傳入的參數為 class A 的大小,這里為 8 個(gè)字節,至于為什么是 8 個(gè)字節,你可以看看《深入 C++ 對象模型》一書(shū),這里不做多解釋。這樣函數返回的是分配內存的起始地址,這里假設是 0x007da290。

  上面分配的內存是未初始化的,也是未類(lèi)型化的,第二步就在這一塊原始的內存上對類(lèi)對象進(jìn)行初始化,調用的是相應的構造函數,這里是調用 A:A(10); 這個(gè)函數,從圖中也可以看到對這塊申請的內存進(jìn)行了初始化,var=10, file 指向打開(kāi)的文件。

  最后一步就是返回新分配并構造好的對象的指針,這里 pA 就指向 0x007da290 這塊內存,pA 的類(lèi)型為類(lèi) A 對象的指針。

  所有這三步,你都可以通過(guò)反匯編找到相應的匯編代碼,在這里我就不列出了。

  好了,那么 delete 都干了什么呢?還是接著(zhù)上面的例子,如果這時(shí)想釋放掉申請的類(lèi)的對象怎么辦?當然我們可以使用下面的語(yǔ)句來(lái)完成:

  delete pA;

  delete 所做的事情如下圖所示:

  delete 就做了兩件事情:

  調用 pA 指向對象的析構函數,對打開(kāi)的文件進(jìn)行關(guān)閉。

  通過(guò)上面提到的標準庫函數 operator delete 來(lái)釋放該對象的內存,傳入函數的參數為 pA 的值,也就是 0x007d290。

  好了,解釋完了 new 和 delete 背后所做的事情了,是不是覺(jué)得也很簡(jiǎn)單?不就多了一個(gè)構造函數和析構函數的調用嘛。

  如何申請和釋放一個(gè)數組?

  我們經(jīng)常要用到動(dòng)態(tài)分配一個(gè)數組,也許是這樣的:

  string *psa = new string[10]; /pic/p>

  int *pia = new int[10]; /pic/p>

  上面在申請一個(gè)數組時(shí)都用到了 new [] 這個(gè)表達式來(lái)完成,按照我們上面講到的 new 和 delete 知識,第一個(gè)數組是 string 類(lèi)型,分配了保存對象的內存空間之后,將調用 string 類(lèi)型的默認構造函數依次初始化數組中每個(gè)元素;第二個(gè)是申請具有內置類(lèi)型的數組,分配了存儲 10 個(gè) int 對象的內存空間,但并沒(méi)有初始化。

  如果我們想釋放空間了,可以用下面兩條語(yǔ)句:

  delete [] psa;

  delete [] pia;

  都用到 delete [] 表達式,注意這地方的 [] 一般情況下不能漏掉!我們也可以想象這兩個(gè)語(yǔ)句分別干了什么:第一個(gè)對 10 個(gè) string 對象分別調用析構函數,然后再釋放掉為對象分配的所有內存空間;第二個(gè)因為是內置類(lèi)型不存在析構函數,直接釋放為 10 個(gè) int 型分配的所有內存空間。

  這里對于第一種情況就有一個(gè)問(wèn)題了:我們如何知道 psa 指向對象的數組的大小?怎么知道調用幾次析構函數?

  這個(gè)問(wèn)題直接導致我們需要在 new [] 一個(gè)對象數組時(shí),需要保存數組的維度,C++ 的做法是在分配數組空間時(shí)多分配了 4 個(gè)字節的大小,專(zhuān)門(mén)保存數組的大小,在 delete [] 時(shí)就可以取出這個(gè)保存的數,就知道了需要調用析構函數多少次了。

  還是用圖來(lái)說(shuō)明比較清楚,我們定義了一個(gè)類(lèi) A,但不具體描述類(lèi)的內容,這個(gè)類(lèi)中有顯示的構造函數、析構函數等。那么 當我們調用

  class A *pAa = new A[3];

  時(shí)需要做的事情如下:

  從這個(gè)圖中我們可以看到申請時(shí)在數組對象的上面還多分配了 4 字節用來(lái)保存數組的大小,但是最終返回的是對象數組的指針,而不是所有分配空間的起始地址。

  這樣的話(huà),釋放就很簡(jiǎn)單了:

  delete [] pAa;

  這里要注意的兩點(diǎn)是:  調用析構函數的次數是從數組對象指針前面的 4 個(gè)字節中取出;

  傳入 operator delete[] 函數的參數不是數組對象的指針 pAa,而是 pAa 的值減 4。

  為什么 new/delete 、new []/delete[] 要配對使用?

  其實(shí)說(shuō)了這么多,還沒(méi)到我寫(xiě)這篇文章的最原始意圖。從上面解釋的你應該懂了 new/delete、new[]/delete[] 的工作原理了,因為它們之間有差別,所以需要配對使用。但偏偏問(wèn)題不是這么簡(jiǎn)單,這也是我遇到的問(wèn)題,如下這段代碼:

  int *pia = new int[10];

  delete []pia;

  這肯定是沒(méi)問(wèn)題的,但如果把 delete []pia; 換成 delete pia; 的話(huà),會(huì )出問(wèn)題嗎?

  這就涉及到上面一節沒(méi)提到的問(wèn)題了。上面我提到了在 new [] 時(shí)多分配 4 個(gè)字節的緣由,因為析構時(shí)需要知道數組的大小,但如果不調用析構函數呢(如內置類(lèi)型,這里的 int 數組)?我們在 new [] 時(shí)就沒(méi)必要多分配那 4 個(gè)字節, delete [] 時(shí)直接到第二步釋放為 int 數組分配的空間。如果這里使用 delete pia;那么將會(huì )調用 operator delete 函數,傳入的參數是分配給數組的起始地址,所做的事情就是釋放掉這塊內存空間。不存在問(wèn)題的。

  這里說(shuō)的使用 new [] 用 delete 來(lái)釋放對象的提前是:對象的類(lèi)型是內置類(lèi)型或者是無(wú)自定義的析構函數的類(lèi)類(lèi)型!

  我們看看如果是帶有自定義析構函數的類(lèi)類(lèi)型,用 new [] 來(lái)創(chuàng )建類(lèi)對象數組,而用 delete 來(lái)釋放會(huì )發(fā)生什么?用上面的例子來(lái)說(shuō)明:

  class A *pAa = new class A[3];

  delete pAa;

  那么 delete pAa; 做了兩件事:

  調用一次 pAa 指向的對象的析構函數;

  調用 operator delete(pAa); 釋放內存。

  顯然,這里只對數組的第一個(gè)類(lèi)對象調用了析構函數,后面的兩個(gè)對象均沒(méi)調用析構函數,如果類(lèi)對象中申請了大量的內存需要在析構函數中釋放,而你卻在銷(xiāo)毀數組對象時(shí)少調用了析構函數,這會(huì )造成內存泄漏。

  上面的問(wèn)題你如果說(shuō)沒(méi)關(guān)系的話(huà),那么第二點(diǎn)就是致命的了!直接釋放 pAa 指向的內存空間,這個(gè)總是會(huì )造成嚴重的段錯誤,程序必然會(huì )奔潰!因為分配的空間的起始地址是 pAa 指向的地方減去 4 個(gè)字節的地方。你應該傳入參數設為那個(gè)地址!

  同理,你可以分析如果使用 new 來(lái)分配,用 delete [] 來(lái)釋放會(huì )出現什么問(wèn)題?是不是總會(huì )導致程序錯誤?

  總的來(lái)說(shuō),記住一點(diǎn)即可:new/delete、new[]/delete[] 要配套使用總是沒(méi)錯的!

【我的家鄉作文該怎么寫(xiě)】相關(guān)文章:

我該怎么表演,我的情敵作文01-07

家鄉小吃的作文,家鄉小吃的作文怎么寫(xiě)05-13

我的表哥作文怎么寫(xiě)02-25

今天,我們該怎么愛(ài)國作文04-16

寫(xiě)我的家鄉作文(精選27篇)12-25

寫(xiě)我的家鄉作文(精選42篇)12-31

我的同學(xué)作文的結尾怎么寫(xiě)11-19

我心中的月 作文怎么寫(xiě)07-22

描寫(xiě)我的好朋友的作文怎么寫(xiě)01-08

我欣賞自己的什么作文怎么寫(xiě)07-11

  • 相關(guān)推薦
一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看