C語言中malloc、free和new、delete的用法和區別


很多學過C的人對malloc都不是很了解,知道使用malloc要加頭文件,知道malloc是分配一塊連續的內存,知道和free函數是一起用的。但是但是:

一部分人還是將:malloc當作系統所提供的或者是C的關鍵字,事實上:malloc只是C標准庫中提供的一個普通函數

而且很多很多人都對malloc的具體實現機制不是很了解。

1,關於malloc以及相關的幾個函數

#include <stdlib.h>(Linux下)

       void *malloc(size_t size);
       void free(void *ptr);
       void *calloc(size_t nmemb, size_t size);
       void *realloc(void *ptr, size_t size);
 也可以這樣認為(window下)原型:extern void *malloc(unsigned int num_bytes);
  頭文件:#include <malloc.h>或者#include <alloc.h>兩者的內容是完全一樣的。

  如果分配成功:則返回指向被分配內存空間的指針

       不然,返回空指針NULL。

       同時,當內存不再使用的時候,應使用free()函數將內存塊釋放掉。

  malloc分配的內存大小至少為size參數所指定的字節數

  malloc的返回值是一個指針,指向一段可用內存的起始地址

  多次調用malloc所分配的地址不能有重疊部分,除非某次malloc所分配的地址被釋放掉

  malloc應該盡快完成內存分配並返回(不能使用NP-hard的內存分配算法malloc和free函數是配對的,如果申請后不釋放就是內存泄露;如果無故釋放那就是什么都沒有做,釋放只能釋放一次,如果釋放兩次及兩次以上會出現錯誤(但是釋放空指針例外,釋放空指針其實也等於什么都沒有做,所以,釋放多少次都是可以的))

  實現malloc時應同時實現內存大小調整和內存釋放函數(realloc和free)

      關於:void *,表示未確定類型的指針。C,C++規定,void *類型可以強轉為任何其他類型的的指針。  

    關於void *的其他說法:

         void * p1;

         int *p2;

         p1 = p2;                 就是說其他任意類型都可以直接賦值給它,無需進行強轉,但是反過來不可以。

2,malloc和new

new返回指定類型的指針,並且可以自動計算所需要的大小。

      int *p;
      p = new int;   //返回類型為int *類型,分配的大小為sizeof(int)
      p = new int[100];    //返回類型為int *類型,分配的大小為sizeof(int) * 100
      而malloc則必須由我們計算字節數,並且在返回的時候強轉成實際指定類型的指針。
      int *p;
      p = (int *)malloc(sizeof(int));
      1,malloc的返回是void *,如果我們寫成了: p = malloc(sizeof(int));間接的說明了(將void *轉化給了int *,這不合理)
      2,malloc的實參是sizeof(int),用於指明一個整形數據需要的大小,如果我們寫成:
      p =  (int *)malloc(1),          那么可以看出:只是申請了一個字節的空間,如果向里面存放了一個整數的話,
      將會占用額外的3個字節,可能會改變原有內存空間中的數據
     3,malloc只管分配內存,並不能對其進行初始化,所以得到的一片新內存中,其值將是隨機的。一般意義上:我
       們習慣性的將其初始化為NULL。 當然,也可以用memset函數的。

簡單的說:

malloc 函數其實就是在內存中:找一片指定大小的空間,然后將這個空間的首地址給一個指針變量,這里的指針變量可以是一個單獨的指針,也可以是一個數組的首地址, 這要看malloc函數中參數size的具體內容。我們這里malloc分配的內存空間在邏輯上是連續的,而在物理上可以不連續。我們作為程序員,關注的 是邏輯上的連續,其它的,操作系統會幫着我們處理的。

3、malloc,free和new,delete的區別

(1)malloc和new都是在堆上分配內存。棧區的內存分配是系統自動分配釋放的,主要存放函數的參數值、局部變量的值等。

(2)Malloc和free在C程序中使用,而C++程序中使用new和delete,刪除數組delete[]p,指針釋放后,要將指針置空。

(3)New和delete可以調用構造函數和析構函數。

(4)Malloc是函數,new是關鍵字。

(5)Malloc不能賦初值,new可以,如int *p = new int(2).代表分配一個int型的內存空間,並賦初值2.如果new int ()代表賦初值0,new int[10]代表分配10個int.

(6)Malloc返回的指針是void *類型,而new返回的指針是它分配空間的類型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM