標籤:

C++ deallocate(pointer p,size_type n)第二個參數問題?

請問C++allocator類中deallocate(pointer p,size_type n)第二個參數有何用處?按道理來說有operator new或者malloc分配的內存只需利用對於的operator delete和free就可以回收了。我看SGI_STL和老版本的VC++實現中deallocate函數內部調用時直接忽略第二個參數,那麼既然忽略,第二個參數有什麼作用呢?以下分別是利用free()和operator delete的大致實現。

SGI_STL

VC++


看標準描述:

Parameters

p-pointer obtained from allocate()

n-number of objects earlier passed to allocate()

其實你有這個疑問,是因為標準實現用new內存分配,它會保存內存分配的n在某個地方,不需要上層傳進來。正所謂「哪有什麼歲月靜好, 不過有人替你負重前行」。但是實現里不用n是「人情」,介面參數傳n是「本分」。如果第三方實現想要自己管理內存,可能就會用到這個參數了。


這個參數告訴你當初調用allocate的時候傳了什麼。


想像一下,如果你寫了一個stack allocator,就是allocator內部放了一個幾K的byte數組,然後分配都從這個數組裡劃,按棧操作的行為來分配,你釋放的時候,不告訴allocator要釋放多少對象,它怎麼知道要把指針移動多少。

之所以free不需要告訴長度,是因為他在分配的內存塊前面已經帶了元信息了,這個對於stack allocator是沒有必要的並且也不可取的,還不如直接告訴長度


就是沒被調用。對於默認分配器std::allocator&,它的deallocate(pointer p,size_type n)函數的第二個參數n就是要求重複寫一下allocate的size,函數內部實際就是沒有用它

那麼它的意義何在呢? 個人理解,它作為默認分配器,可以被用作為其他更高端一點的分配器的interface,說不定其他分配器的deallocate就要用這個n了呢。比如boost的pool_allocator,看了下源文件,它的deallocate(pointer ptr, size_type n)內部就調用了n

http://www.boost.org/doc/libs/1_61_0/boost/pool/pool_alloc.hpp

再就是有可能分配器定義的多了,釋放內存的時候和allocate函數分配的內存size一一對應,一目了然,編程更規範。


只看過SGI的allocator。當這個指針所指區域大於128位元組時直接free(p),此時不需要第二個參數,free不需要告知大小信息。小於128時,需要第二個參數判斷回收進free_list的哪個位置,留著以後備用,並不是直接free的。


推薦閱讀:

C++能勝任C的所有工作嗎?不行,有哪些?
c++delete一個指針,沒有賦值為null,再創建同類型的指針,有沒有可能被釋放資源的內存地址被重新使用,賦值給新指針?如何用程序驗證這種可能性?這個class里有成員是引用,引用所指的內存也會被釋放嗎?
如何評價C++17中的新特性fold expression?
C++有右值引用以後是否可以直接return 字元串、結構體而無需考慮大量數據複製的性能問題了?
C++ 研發實習生面試通常會被問到什麼問題?

TAG:STL | C | 編程學習 |