2015-04-02 88 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());