在
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.相比於用過某個軟體某...