C 中new與delete的用法

2021-12-29 23:44:05 字數 1860 閱讀 3866

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

new和delete是c++中的兩個操作符,new用於給單個物件或者陣列,結構等分配記憶體,在記憶體使用完後,用delete進行釋放記憶體。而且是一一對應關係,有了new分配了記憶體,必然需要delete來釋放記憶體,其分配和釋放的必須是同一位址的記憶體。不然就很有可能導致記憶體洩漏的後果,如果記憶體洩漏嚴重,程式就極有可能崩潰。

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

(1)聯編(binding):聯編是指乙個電腦程式自身彼此關聯(使乙個源程式經過編譯、連線,成為乙個可執行程式)的過程,在這個聯編過程中,需要確定程式中的操作呼叫(函式呼叫)與執行該操作(函式)的**段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。

(2)靜態聯編(static binding):是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯編也叫早繫結,在編譯階段就必須了解所有的函式或模組執行所需要檢測的資訊,它對函式的選擇是基於指向物件的指標(或者引用)的型別。

(3)動態聯編(dynamic binding):指在程式執行的時候才將函式實現和函式呼叫關聯,因此也叫執行時繫結或者晚繫結,動態聯編對函式的選擇不是基於指標或者引用,而是基於物件型別,不同的物件型別將做出不同的編譯結果。

然後我們假設需要編寫乙個程式,其中需要的陣列長度無法在編譯時進行確定,而需要在執行時期確定其中的值,這樣就無法通過宣告乙個陣列滿足需求了。因為宣告陣列後,程式在編譯期間將會為它分配記憶體,無論程式最終是否使用過陣列,這個陣列都占用了一定的記憶體,而且它不夠靈活。所以在這種情況下,我們就需要使用動態聯編。也是用使用new建立動態陣列,在執行時分配記憶體。

**例項:

#include

int main()

這段**簡單易懂,但凡有點程式設計基礎的人應該都能看懂。其中最關鍵的兩句無非就是new分配記憶體和delete釋放記憶體的語句。new表示式分配了乙個含有三個元素的陣列,並且指標指向陣列第乙個元素,陣列名此時表示陣列第乙個元素的位址。

建立動態結構和建立動態陣列的方式和思想並沒有太大的出入。直接上例項,在**中分析。

struct struct1 //structure definition

;int main()

簡單說幾點和建立動態陣列的不同之處:

<1>建立陣列時的指標型別可以根據需求不同可以是int,char,double等等,建立結構時指標型別就只能是結構變數了,也就是上述**中的struct1,不能任意的喜歡那個型別就上哪個了。指標方面的不同就不分析了

<2>對於建立陣列,分配記憶體和釋放記憶體時都有乙個,但是在結構中,就沒有這個了。

動態建立物件時,只需指定其資料型別,不必為該物件命名,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件。

int main()

最後簡單提一下這段**中的nights變數和pd指標的值都存放在棧(stack)中,而用new分配的內存在堆(heap)或者自由儲存區(free store)中。

c 中new與delete的用法小結

1.首先分析下new與operator new 的區別 1 string ps new string memory 這裡所使用的new就是所謂new operator,是由c 語言內建的,不能改變意義,總是做相同的事情。這個動作的含義分為兩方面 第一,它分配足夠的記憶體,用來放置某型別的物件。對於上...

C 中new和delete的用法

首先,new和delete運算子是用於動態分配和撤銷記憶體的運算子。一 new用法 1.開闢單變數位址空間 使用new運算子時必須已知資料型別,new運算子會向系統堆區申請足夠的儲存空間,如果申請成功,就返回該記憶體塊的首位址,如果申請不成功,則返回零值。new運算子返回的是乙個指向所分配型別變數 ...

C 中new和delete的用法

c 中new和delete的用法 對於計算機程式設計而言,變數和物件在記憶體中的分配都是編譯器在編譯程式時安排好的,這帶來了極大的不便,如陣列必須大開小用,指標必須指向乙個已經存在的變數或物件。對於不能確定需要占用多少記憶體的情況,動態記憶體分配解決了這個問題。new和delete運算子是用於動態分...