C++開發系列-C語言的malloc與C++的new分配空間


概述

在軟件開發過程中,常常需要動態地分配和撤銷存儲空間,例如對動態鏈表中結點的插入與刪除。在C語言中是利用庫函數malloc和free來分配和撤銷內存空間的。C++提供了較簡便而功能較強的運算符new和delete來取代malloc和free函數。

注意: new和delete是運算符,不是函數,因此執行效率高。 雖然為了與C語言兼容,C++仍保留malloc和free函數,但建議用戶不用malloc和free函數,而用new和delete運算符。

new int;  //開辟一個存放整數的存儲空間,返回一個指向該存儲空間的地址(即指針)
new int(100);  //開辟一個存放整數的空間,並指定該整數的初值為100,返回一個指向該存儲空間的地址

new char[10];  //開辟一個存放字符數組(包括10個元素)的空間,返回首元素的地址
new int[5][4];  //開辟一個存放二維整型數組(大小為5*4)的空間,返回首元素的地址

float *p=new float (3.14159);  //開辟一個存放單精度數的空間,並指定該實數的初值為//3.14159,將返回的該空間的地址賦給指針變量p

用new分配數組空間時不能指定初值。如果由於內存不足等原因而無法正常分配空間,則new會返回一個空指針NULL,用戶可以根據該指針的值判斷分配空間是否成功。

malloc與new分配基本數據類型空間

// C語言 malloc與free
int *p = (int *)malloc(sizeof(int));
*p = 10;
free(p); // 釋放分配的空間
    
// C++語言 new 與 delete
int *p2 = new int;
*p2 = 20;

int *p3 = new int(5);
printf("p3=%d", *p3);
    
delete p2; // 釋放分配的空間
delete p3; // 釋放分配的空間

malloc與new分配數組數據類型空間

// 分配數組
void test2(){
    // C語言分配數組
    int *p = (int *)malloc(sizeof(int)*10);
    p[0] = 1;
    free(p);
    
    // C++語言分配數組
    int *pp = new int[10];
    pp[0] = 1;
    
    delete [] pp; // 釋放數組需要添加[]
}

malloc與new分配類類型空間

// 分配對象
void test3(){
    
    // C語言的malloc
    Circle *c = (Circle *)malloc(sizeof(Circle));
    c->m_r = 10.0;
    double s =  c->getS();
    free(c);
    
    // C++語言 new
    Circle *c2 = new Circle();
    Circle *c3 = new Circle(10.0); // 有參構造函數
    c3->m_r = 10.0;
    double s3 =  c3->getS();
    
    delete c2;
    delete c3; 
}

在執行new運算時,如果內存量不足,無法開辟所需的內存空間,目前大多數C++編譯系統都使new返回一個0指針值。只要檢測返回值是否為0,就可判斷分配內存是否成功。

new 會調用類的構造函數 delete能調用類的析構函數,C語言的malloc與free函數則相反。


免責聲明!

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



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