在C++標准庫中,有關缺省變量值的限制非常模糊。基於此,很多編譯器允許開發人員將缺省變量值包含在函數聲明,指向函數的指針和引用,成員函數的指針,以及typedef聲明中。
例外一種需要更好的內存控制的情況是:需要在有限資源的情況下長時間不間斷運行的程序。實時系統經常需要用最少的耗費來獲取有保證的可預期的內存。這也就導致了更好的內存控制的需要。
一般來說,這些程序都避免使用動態的內存分配,而使用特殊目的的內存分配器來管理有限資源。此外,還有一些情況下由於硬件或系統的要求,需要將對象放在指定的內存位置。這也需要進行定制的內存管理通過重載new來加以實現)。
當分配內建built-in)類型的對象、未包含用戶自定義的new操作符函數的類對象、任何類型的數組時,使用全局new操作符函數。當在類中自定義C++標准庫,分配該類對象的內存時,調用該類的new操作符。如下:
- #include
- #include
- class Blanks
- {
- public:
- Blanks(){}
- void *operator new( size_t stAllocateBlock, char chInit );
- };
- void *Blanks::operator new( size_t stAllocateBlock, char chInit )
- {
- void *pvTemp = malloc( stAllocateBlock );
- if( pvTemp != 0 )
- memset( pvTemp, chInit, stAllocateBlock );
- return pvTemp;
- }
- int main()
- {
- Blanks *a5 = new( 0xa5 ) Blanks;//創建對象Blanks,並且初試化為0xa5
- return a5 != 0;
- }
new操作符可以重載,而delete卻不行。因為等到需要釋放的時候,我們所能得到的就是一個指針。而且該指針可能不是原先的對象類型指針有可能進行了類型轉換)。實際上,當使用new獲得一個指向一片內存的指針時,在該片內存前有一個指示器indicator),記錄實際分配的內存數量。當調用delete時,可以獲知需要釋放的內存大小。數組的釋放Deallocating Arrays):
- void f( )
- {
- X* p1 = new X[10];
- //...
- delete [] X;
- }
為什麼不使用delete [10] X;來釋放內存?Bjarne Stroustrup稱這種做法容易導致錯誤,而將記錄元素個數的任務放在delete的實現中了。至於為什麼C++中未內建垃圾收集器Garbage Collection)的原因,看《C++語言的設計和演化》En) Bjarne Stroustrup 機械工業出版社俗稱:D&E)可以得到答案。
此外,C++標准庫中提供了一種智能型指針auto_ptr,這種指針可以幫助我們防止“被異常拋出時發生資源洩漏”。但是缺點是該智能型指針不能指向數組,因為其內部釋放內存是通過delete而非delete [] 來進行的。
所以,只能使用其來指向一個單個對象。模板部分是C++中比較難的部分,也是C++的魅力所在。以下文字是我以前看過的,具體出處不清楚了。今天稍微整理了一下,作為模板介紹的一個單元。