18.1.4 定位new表達式
標准庫函數operator new和operator delete是allocator的allocate和deallocate成員的低級版本,它們都分配但不初始化內存。
allocator的成員construct和destroy也有兩個低級選擇,這些成員在由allocator對象分配的空間中初始化和撤銷對象。
類似於construct成員,有第三種new表達式,稱為定位new(placement new)。定位new表達式在已分配的原始內存中初始化一個對象,它與new的其他版本的不同之處在於,它不分配內存。相反,它接受指向已分配但未構造內存的指針,並在該內存中初始化一個對象。實際上,定位new表達式使我們能夠在特定的、預分配的內存地址構造一個對象。
定位new表達式的形式是:
new (place_address) type
new (place_address) type (initializer-list)
new (place_address) type
new (place_address) type (initializer-list)定位new表達式比allocator類的construct成員更靈活,定位new表達式初始化一個對象的時候,它可以使用任何構造函數,並直接建立對象。construct函數總是使用復制構造函數。
template<class T>
void Vector<T>::push_back(const T& t){
if(first_free==end)
reallocate(); //gets more space and copies existing elements to it
new(first_free) T(t);
++first_free;
}
template<class T>
void Vector<T>::push_back(const T& t){
if(first_free==end)
reallocate(); //gets more space and copies existing elements to it
new(first_free) T(t);
++first_free;
}
18.1.5 顯式析構函數的調用
正如定位new表達式是使用allocator類的construct成員的低級選擇,我們可以使用析構函數的顯式調用作為調用destroy函數的低級選擇。
for(T *p=first_free;p!=elements;){
p->~T();
}
for(T *p=first_free;p!=elements;){
p->~T();
}顯式調用析構函數的效果是適當清除對象本身。但是,並沒有釋放對象所占的內存,如果需要,可以重用該內存空間。
調用operator delete函數不會運行析構函數,它只釋放指定的內存。
摘自 xufei96的專欄