程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++中new與delete的用法

C++中new與delete的用法

編輯:C++入門知識

C++中new與delete的用法


最近在學習C++的過程中,發現指針以及new和delete的使用遍布全書,可見其重要性。在學習了一個階段之後,總結一下new和delete的用法,指針還沒有摸透,待日後總結。

1.new和delete有什麼用?

new和delete是C++中的兩個操作符,new用於給單個對象或者數組,結構等分配內存,在內存使用完後,用delete進行釋放內存。而且是一一對應關系,有了new分配了內存,必然需要delete來釋放內存,其分配和釋放的必須是同一地址的內存。不然就很有可能導致內存洩漏的後果,如果內存洩漏嚴重,程序就極有可能崩潰。

2.使用new創建動態數組

在這裡順便介紹三個術語:

(1)聯編(binding):聯編是指一個計算機程序自身彼此關聯(使一個源程序經過編譯、連接,成為一個可執行程序)的過程,在這個聯編過程中,需要確定程序中的操作調用(函數調用)與執行該操作(函數)的代碼段之間的映射關系,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。

(2)靜態聯編(static binding):是指在編譯階段就將函數實現和函數調用關聯起來,因此靜態聯編也叫早綁定,在編譯階段就必須了解所有的函數或模塊執行所需要檢測的信息,它對函數的選擇是基於指向對象的指針(或者引用)的類型。

(3)動態聯編(dynamic binding):指在程序執行的時候才將函數實現和函數調用關聯,因此也叫運行時綁定或者晚綁定,動態聯編對函數的選擇不是基於指針或者引用,而是基於對象類型,不同的對象類型將做出不同的編譯結果。


然後我們假設需要編寫一個程序,其中需要的數組長度無法在編譯時進行確定,而需要在運行時期確定其中的值,這樣就無法通過聲明一個數組滿足需求了。因為聲明數組後,程序在編譯期間將會為它分配內存,無論程序最終是否使用過數組,這個數組都占用了一定的內存,而且它不夠靈活。所以在這種情況下,我們就需要使用動態聯編。也是用使用new創建動態數組,在運行時分配內存。

代碼實例:

#include 
int main()
{
	using namespace std;
	int * point = new int[3];
                                  //int * point[3] = new int;	
                                  //This is a wrong way to difine a array
	point[0] = 1;
	point[1] = 2;
	point[2] = 3;
	
	cout << "point[0] is " << point[0] << "\n";
	cout << "point[1] is " << point[1] << "\n";
	cout << "point[2] is " << point[2] << endl;    //endl is equal to  "\n"
	
	delete [] point;	//free memory 
	
	return 0;
}

這段代碼簡單易懂,但凡有點編程基礎的人應該都能看懂。其中最關鍵的兩句無非就是new分配內存和delete釋放內存的語句。new表達式分配了一個含有三個元素的數組,並且指針指向數組第一個元素,數組名此時表示數組第一個元素的地址。


3.使用new創建動態結構

創建動態結構和創建動態數組的方式和思想並沒有太大的出入。直接上實例,在代碼中分析。

struct struct1       //structure definition
{
    char name[20];
    float volume;
    double price;        
};
int main()
{
    using namespace std;
    struct1 * ps = new struct1;       //allot memory for structure
    
    cout << "Enter name of struct1 item: ";
    cin.get(ps->name,20);
    cout << "Enter volume in cubic feet: ";
    cin >> (*ps).volume;        //method 2 for memory access
    cout << "Enter price: $";
    cin >> ps -> price;
    cout << "Name: " << (*ps).name << endl;
    
    cout << "Volume: " << ps->volume << " cubic feet\n";    //method 1
    cout << "Price: $" << ps->price << endl;                //method 2
    
    delete ps;
    return 0;
}
簡單說幾點和創建動態數組的不同之處:

<1>創建數組時的指針類型可以根據需求不同可以是int,char,double等等,創建結構時指針類型就只能是結構變量了,也就是上述代碼中的struct1,不能任意的喜歡那個類型就上哪個了。指針方面的不同就不分析了

<2>對於創建數組,分配內存和釋放內存時都有一個[],但是在結構中,就沒有這個[]了。

4.使用new創建單個對象

動態創建對象時,只需指定其數據類型,不必為該對象命名,new表達式返回指向新創建對象的指針,我們通過該指針來訪問此對象。

int main()
{
    using namespace std;
    int nights = 1001;
    int * pt = new int;     //allocate space for an int
    *pt = 1001;             //store a value there  
    
    cout << "nights value = ";
    cout << nights << ": location " << &nights << endl;
    cout << "int ";
    cout << "value = " << *pt << ": location  = " << pt << endl;
    double * pd = new double;       //allocate space for a double
    *pd = 10000001.0;                //store a value there
    
    cout << "double ";
    cout << "value = " << *pd << ": location = " << pd << endl;
    cout << "location of pointer pd: " << &pd << endl;
    cout << ": size of * pt = " << sizeof(*pt) << endl;
    cout << "size of pd = " << sizeof pd;
    cout << ": size of *pd = " << sizeof(*pd) << endl;
    return 0;  
}
最後簡單提一下這段代碼中的nights變量和pd指針的值都存放在棧(stack)中,而用new分配的內存在堆(heap)或者自由存儲區(free store)中。




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved