我有一些安全關鍵代碼,我想確保敏感緩衝區在釋放前總是被擦除。我可以實現一個在析構函數中調用memset_s的緩衝區類,但也許有一種更方便的方法。std :: memset_s分配器向量
如果我將std :: allocator替換爲deallocate()中調用memset_s的變體,是否會迫使std :: vector不要在除了臨時對象之外的任何地方分配T對象?
謝謝。
我有一些安全關鍵代碼,我想確保敏感緩衝區在釋放前總是被擦除。我可以實現一個在析構函數中調用memset_s的緩衝區類,但也許有一種更方便的方法。std :: memset_s分配器向量
如果我將std :: allocator替換爲deallocate()中調用memset_s的變體,是否會迫使std :: vector不要在除了臨時對象之外的任何地方分配T對象?
謝謝。
有兩個原因讓你可以擁有這樣的T對象:無論是作爲向量的元素還是其他原因。
它們不能是矢量的元素,因爲這會違反連續性,並且違反了swap
的無投擲保證。如果你有其他原因的元素,那麼他們必須構建可觀察的複雜性。另外T::T()
可能不可用(不需要DefaultConstructable
)或它可能會拋出,這也是一個可觀察的效果。
因此,一般vector
不能有「隱藏」元素。
分配器是一個模板參數,如果你決定實施一個針對具體應用情況下,將積極只在你明確地選擇加入到這個分配器這些對象:
std::vector<T,SecureAllocator> v; // this uses the memset_s under the hood
std::vector<T> n; // this doesn't
現在,分配器修改對象的類型,這意味着如果你有以std::vector<T>
作爲參數的函數,你將無法通過std::vector<T,SecureAllocator>
。
或者,您可以實現一個多態分配器,其中可以在運行時控制內存的來源。即在BSL(在github上可用的C++ 03標準庫的實施方案),在這種情況下,載體是相同類型的支持,即使它們來自不同源的分配:
bsl::vector<T> v(bslma::Default::allocator());
// bslma::Default::allocator() is new/delete
bsl::vector<T> n(secureAllocator());
大概的興趣:HTTP ://stackoverflow.com/a/5735744/16287 – 2015-04-02 21:33:43
是的,最好的解釋[這裏](http://stackoverflow.com/questions/8190950/may-stdvector-make-use-of-small-buffer-optimization )。 – MSalters 2015-04-02 21:42:10
'allocate_shared'或者['allocate_unique']的一些變體(http://stackoverflow.com/a/23132307/596781)? – 2015-04-02 21:55:07