9、正如定位new(placement new expression)運算式是使用allocator類的construct成員的低級選擇,可以使用解構函式的顯式調用作為調用destroy函數的低級選擇。
範例程式碼
for (T *p = first_free; p != elements; /*empty*/)alloc.destroy(--p);//上式表達與下式表達等價p->~T();
10、顯式調用解構函式是清除對象本身,並沒有釋放對象所佔的記憶體;調用operator delete函數不會運行解構函式,它只釋放指定的記憶體。
11、類通過定義自己的名為operator new和operator delete的成員,可以管理用於自身類型的記憶體。
編譯器看到類類型(for a class type)的new或delete運算式的時候,它查看該類是否有operator new或operator delete成員,如果類定義(或繼承)了自己的成員new和delete函數,則使用那些函數為對象分配和釋放記憶體;否則使用標準庫版本。
最佳化new和delete的行為的時候,只需要定義operator new和operator delete的新版本,new和delete運算式自己照管對象的構造撤銷。
12、在自訂new和delete的時候,應當成對定義。要用自訂全用,要用全域的也全用全域的。
可以通過全域範圍確定操作符來強制new,delete運算式使用的是全域的庫函數。
範例程式碼
Type *p = ::new Type; //uses global operator new::delete p; //uses global operator delete
13、如果基類有 virtual 解構函式,則傳給 operator delete 的大小將根據被刪除指標所指對象的動態類型而變化;如果基類沒有 virtual 解構函式,那麼,通過基類指標刪除指向衍生類別對象的指標的行為,跟往常一樣是未定義的。
這些函數(operator new和operator delete)隱式地為靜態函數,不必顯式地將它們聲明為static。成員 new 和 delete 函數必須是靜態,因為它們要麼在構造對象之前使用(operator new),要麼在撤銷對象之後使用(operator delete),因此,這些函數沒有成員資料可操縱。像任意其他靜態成員函數一樣,new 和 delete 只能直接存取所屬類的靜態成員。
14、一個通用策略是預先分配一場原始記憶體來儲存未構造的對象,建立新元素的時候,可以在一個預先分配的對象中構造;釋放元素的時候,將它們放回預先指派至的塊中,而不是將記憶體實際返還給系統。這種策略常被稱為維持一個自由列表。可以將自由列表實現為已指派但未構造的對象的鏈表。