2015-04-02 87 views
3

我有一些安全關鍵代碼,我想確保敏感緩衝區在釋放前總是被擦除。我可以實現一個在析構函數中調用memset_s的緩衝區類,但也許有一種更方便的方法。std :: memset_s分配器向量

如果我將std :: allocator替換爲deallocate()中調用memset_s的變體,是否會迫使std :: vector不要在除了臨時對象之外的任何地方分配T對象?

謝謝。

+0

大概的興趣:HTTP ://stackoverflow.com/a/5735744/16287 – 2015-04-02 21:33:43

+0

是的,最好的解釋[這裏](http://stackoverflow.com/questions/8190950/may-stdvector-make-use-of-small-buffer-optimization )。 – MSalters 2015-04-02 21:42:10

+0

'allocate_shared'或者['allocate_unique']的一些變體(http://stackoverflow.com/a/23132307/596781)? – 2015-04-02 21:55:07

回答

2

有兩個原因讓你可以擁有這樣的T對象:無論是作爲向量的元素還是其他原因。

它們不能是矢量的元素,因爲這會違反連續性,並且違反了swap的無投擲保證。如果你有其他原因的元素,那麼他們必須構建可觀察的複雜性。另外T::T()可能不可用(不需要DefaultConstructable)或它可能會拋出,這也是一個可觀察的效果。

因此,一般vector不能有「隱藏」元素。

+0

'vector'可以創建'value_type'的局部變量。這是完成的,例如在單元素'insert'和'emplace'函數中,可能允許在函數參數替代當前緩衝區時插入元素,並且需要調整緩衝區的大小。 – dyp 2015-04-03 00:57:51

+0

@dyp:確實,這些調用期間可能存在。一旦函數返回,它們必須消失。這可以工作,因爲'T'必須是CopyConstructable。也許不是字面上的暫時的,而是足夠接近於一個。 – MSalters 2015-04-03 10:40:26

2

分配器是一個模板參數,如果你決定實施一個針對具體應用情況下,將積極只在你明確地選擇加入到這個分配器這些對象:

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());