我有一些安全关键代码,我想确保敏感缓冲区在释放前总是被擦除。我可以实现一个在析构函数中调用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