程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 第18章 特殊工具與技術(3)

第18章 特殊工具與技術(3)

編輯:C++入門知識

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的專欄
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved