C++編程之new的用法以及其代碼書寫格式

首先第一句,new的作用是開闢空間並初始化,即開闢空間,調用類的構造函數。
在C++中,我們都是使用new來申請空間,delete釋放空間。C語言中,我們使用的是malloc申請空間,free釋放空間。二者的區別我們下面有講。值得注意的一點是:平日裏,我們聲明變量所創建空間在棧或者數據段上,這些都不需要程序員手動釋放,在結束時(這裏的結束指的是例如在函數內部創建的局部變量,在函數調用結束後的結束),系統會自動釋放。然而,程序員使用new或者是malloc創建的空間時在堆上,如果程序員不手動釋放空間,內存就會出現”內存泄露”現象(內存泄露是指在程序一直運行時,不斷的開闢空間而不去釋放,就會導致該機器上的內存越來越少。當程序退出時,系統會自動回收那些沒有釋放掉的內存空間,但是注意,這是系統釋放的,不是程序本人釋放的。)
一般使用new的格式爲:

T* ptr = new T();

事實上,new一般都是調用operator new來分配空間,如果手動重載了operator new,即A::operator new()則會調用重載的operator new,不然那就調用系統默認的operator new()。
operator new有三種方式。

(1) void* operator new (std::size_t size);
(2) void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept;
(3) void* operator new (std::size_t size, void* ptr) noexcept;

(1)分配size字節的存儲空間,成功的話返回一個指針,按照內存對齊規則內存對齊,返回分配空間的第一個的地址。失敗的話,會拋異常,不會調用構造函數。
(2)分配size字節的存儲空間,成功的話返回一個指針,按照內存對齊規則內存對齊,返回分配空間的第一個地址。失敗的話,返回NULL,不會拋異常,也不會調用構造函數。
(3)只返回ptr指針,不分配空間。這裏的ptr指向已經分配好的空間。new調用對象的構造函數,ptr指向的內存只要不釋放,就可以一直重複使用。所以,一般都是在內存池的實現中使用。也就是placement new版本。(瞭解)

malloc和new的區別
(1)malloc是函數,new是關鍵字
(2)malloc只能按照字節數來分配空間大小,new不僅可以按照字節數分配空間大小,也可以按照類型,對象分配空間大小。
(3)開闢失敗時,malloc返回一個NULL,new拋異常。
new 的一般格式:
格式1:指針變量名=new 類型標識符;
格式2:指針變量名=new 類型標識符(初始值);
格式3:指針變量名=new 類型標識符 [內存單元個數];

(1)int* ptr1 = new int;//開闢一個存儲一個整形大小的空間。ptr1指向開闢好的空間的第一個地址。
(2)int* ptr2 = new int(1);//開闢一個存儲一個整形大小的空間,ptr2指向開闢好的這個空間的第一個地址,並將這個空間初始化爲1。
delete ptr1;
delete ptr2;

以上是前兩種開闢空間的格式以及釋放空間的方式。

(3)int* ptr3 = new int[4];
delete ptr3[];

開闢數組空間,釋放方式。
重要提醒:new int[4]就需要使用delete ptr3[]釋放。需要配對使用。如果只是採用delete ptr3,就只會釋放這個數組的第一個元素,剩下的就會造成內存泄露問題。
當我們使用new int[]申請空間時,申請到的空間操作系統會在最開始有一個4字節空間來保存後面一共開闢了幾個空間。所以,釋放空間時,同時需要釋放掉這個4字節空間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章