對C 中new的一點看法

2021-05-22 01:26:50 字數 1503 閱讀 1435

c語言中,動態獲取記憶體空間一般是通過執行時庫的

malloc

或calloc

,相應的釋放函式為

free

,除此以外,還可以直接使用

win32

的api

(globalalloc/localalloc

)。在c++

中,增加了乙個新的記憶體分配操作符

new,使用者可以根據自己的需要實現動態記憶體申請,它的作用僅此而已。對於呼叫指定的類建構函式初始化記憶體,通過對**的跟蹤,你會發現那是在

new呼叫之後,跳出操作符的控制範圍後發生的,和

new沒有任何關係,那只是編譯器在編譯時自動新增的**,給人的感覺它們好像是一體的。

如果建立乙個類型別的物件,通常的形式是

type* pobj = new type(…);

編譯器編譯之後,會產生兩步,第一步是呼叫

malloc

申請記憶體(當然你也可以重寫用其他方式申請記憶體),成功後返回記憶體指標;第二步在指標開始的記憶體處呼叫建構函式完成初始化。因此對

new的過載,就是完成申請記憶體空間並返回

void

指標的操作符的功能。對於它的形式,只要第乙個引數能接收類型別的大小就行,其它引數不做限制,即

void* new(size_t size,……)

,在mfc

的類cobject

定義中,你可以看到微軟擴充套件的功能。在呼叫時,第乙個引數不用傳遞,編譯器會自動新增,所以平時我們建立物件時,直接在

new後面跟物件的型別名稱。

c++提供了乙個全域性的

new操作符

void* operator new(size_t size)

,通過跟蹤你會發現,它就是用

malloc

申請記憶體並返回記憶體指標。在一些資料裡我們還可能看到乙個叫做

placement new

的操作符,它的形式為

void* operator new(size_t size,void* p)

;呼叫方式

type* pobj = new(pbuffer) type(…)

;其實它只是

new操作符的一種過載形式而已,完成在已分配的記憶體上初始化物件,由於它接受已分配的記憶體位址為引數,所以它什麼都不做,直接返回該指標,讓編譯器去呼叫建構函式,所以老外叫它

placement new

,意思是將

new放置在指定的地方執行,並不象許多地方說的那樣,

new操作符分三步,第一步分配記憶體,第二步是

placement new

,第三步呼叫建構函式,難道編譯器會多此一舉,在你呼叫

new操作符時,會連續呼叫兩個

new操作符嗎?對於乙個具體類來說,如果你不對

new操作符重寫,實現

placement new

的話,它根本就不存在,編譯器只會呼叫全域性的

new操作符完成物件建立,即便你呼叫它,編譯也通不過,因為根本就不存在這樣的操作符過載。

對需求的一點看法

需求是什麼,如何來做好需求,在cmmi 模型裡都給予了說明。模型將需求分為兩個部分,乙個是二級的需求管理,另乙個是 的需求開發 之後又看了rup 對需求的描述,它沒有明確對需求管理與開發進行劃分,它的工作流包括了以下幾個部分 問題分析,理解涉眾需要,定義系統,管理專案規模,改進系統定義,管理需求變更...

對教育的一點看法

百年大計,教育為本。這句話是誰說的,我就不說了,但是,什麼樣的教育是好的教育,什麼樣的人才是真正祖國需要的人才,什麼樣的教育模式才是真正好的教育模式,我作為乙個讀書讀了十多年的人,已經有了自己的看法,我想能看到我這篇博文的,都曾經有過乙個身份,那就是 學生 不論學歷是碩士 博士,還是本科專科,還是小...

對架構的一點看法

隨便想到點什麼就隨便寫寫,但是在實踐過程中,以下幾點真的很重要 關於架構 1.所有脫離業務的架構設計都是耍流氓 2.架構設計就是解決問題 權衡利弊的過程 3.權衡是架構逃避不掉的問題。可擴充套件性 業務方需求 效能 現狀 改變代價等的權衡 4.架構一定要有全域性觀 關於能力 1.相比於用過某個軟體某...