new與malloc的區別和使用

一、new和malloc的基本概念

new和malloc都是用於動態分配內存的函數。dynamic memory allocation是指在程序運行時動態分配內存,也稱堆分配(heap allocation),與靜態內存分配(即編譯時內存分配)相對應。C++引入了new和delete來代替C語言中常用的malloc和free。

malloc(memory allocation)函數定義在stdlib.h頭文件中。malloc函數申請一塊指定大小的內存塊,並返回指向該內存塊的指針。內存中的數據是未初始化的,需要使用memset函數來清零。

new和delete是C++的關鍵字,是一對運算符。使用new運算符可以動態分配內存,並返回指向新內存的指針,而使用delete則可以將內存釋放。

//malloc的用法示例
#include

int main(){
    int *p = (int*)malloc(sizeof(int));
    *p = 10;
    free(p);
    return 0;
}

//new的用法示例
#include

int main(){
    int *p = new int;
    *p = 10;
    delete p;
    return 0;
}

二、new與malloc的區別

1.返回值類型不同

malloc返回void類型指針,在C++語言中需要進行強制類型轉換才能賦值給指定類型的指針。new則返回指定類型的指針,不需要進行強制類型轉換。

#include
#include

int main(){
    int *p = (int*)malloc(sizeof(int));
    int *q = new int;
    std::cout << typeid(p).name() << std::endl;
    std::cout << typeid(q).name() << std::endl;
    free(p);
    delete q;
    return 0;
}
//運行結果:Pv(void指針類型), Pi(int指針類型)

2.運算符重載

new和delete是C++的關鍵字,是一對運算符,支持重載。使用new可以自動調用構造函數,使用delete可以自動調用析構函數。

#include

class A{
public:
    A(){std::cout << "A constructor" << std::endl;}
    ~A(){std::cout << "A destructor" << std::endl;}
};

int main(){
    A *a1 = (A*)malloc(sizeof(A));
    A *a2 = new A();
    free(a1);
    delete a2;
    return 0;
}

//運行結果只有new能調用構造函數和析構函數

3.內存越界檢查

new進行內存分配時,會進行越界檢查。

#include
#define LEN 10

int main(){
    int *p1 = (int*)malloc(sizeof(int) * LEN);
    int *p2 = new int[LEN];
    for(int i = 0; i < LEN+5; ++i){
        std::cout << p1[i] << " ";  //越界訪問p1,並不會拋出異常
    }
    std::cout << std::endl;
    for(int i = 0; i < LEN+5; ++i){
        std::cout << p1[i] << " ";  //越界訪問p2,會拋出異常
    }
    free(p1);
    delete[] p2;
    return 0;
}

4.分配對象空間不同

new可以同時分配對象和空間,而malloc只能分配空間。

#include
#include

class A{
public:
    int x;
    char* str;
};

int main(){
    A *a1 = (A*)malloc(sizeof(A));  //只分配空間,需要手動初始化對象
    a1->x = 1;
    a1->str = (char*)malloc(sizeof(char) * 10);
    strcpy(a1->str, "hello");
    std::cout << "x = " <x << ", str = " <str <str);
    free(a1);
    A *a2 = new A();  //分配空間並初始化對象
    a2->x = 2;
    a2->str = (char*)malloc(sizeof(char) * 10);
    strcpy(a2->str, "world");
    std::cout << "x = " <x << ", str = " <str <str);
    delete a2;
    return 0;
}

三、小結

new和malloc都是用於動態分配內存的函數。new和delete是C++的關鍵字,支持運算符重載和對析構函數的調用,可以自動調用構造函數和析構函數。new進行內存分配時會進行內存越界檢查,malloc不會。new可以同時分配對象和空間,而malloc只能分配空間。選擇使用哪個函數,需要結合具體的情況來考慮。

原創文章,作者:KJHQB,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332953.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KJHQB的頭像KJHQB
上一篇 2025-01-27 13:34
下一篇 2025-01-27 13:34

相關推薦

  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Shell腳本與Python腳本的區別

    本文將從多個方面對Shell腳本與Python腳本的區別做詳細的闡述。 一、語法差異 Shell腳本和Python腳本的語法存在明顯差異。 Shell腳本是一種基於字元命令行的語言…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟體開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • TensorFlow和Python的區別

    TensorFlow和Python是現如今最受歡迎的機器學習平台和編程語言。雖然兩者都處於機器學習領域的主流陣營,但它們有很多區別。本文將從多個方面對TensorFlow和Pyth…

    編程 2025-04-28
  • 麥語言與Python的區別

    麥語言和Python都是非常受歡迎的編程語言。它們各自有自己的優缺點和適合的應用場景。本文將從語言特性、語法、生態系統等多個方面,對麥語言和Python進行詳細比較和闡述。 一、語…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • Python與C語言的區別和聯繫

    Python與C語言是兩種常用的編程語言,雖然兩者都可以用於編寫軟體程序,但是它們之間有很多不同之處。本文將從多個方面對Python與C語言的區別和聯繫進行詳細的闡述。 一、語法特…

    編程 2025-04-28
  • Python中深拷貝和淺拷貝的區別

    本文將從以下幾個方面對Python中深拷貝和淺拷貝的區別做詳細的闡述,包括:拷貝的含義、變數和對象的區別、淺拷貝的示例、深拷貝的示例、可變對象和不可變對象的區別、嵌套的數據結構以及…

    編程 2025-04-28

發表回復

登錄後才能評論