std::带有memset_s分配器的矢量

std::vector with memset_s allocator

本文关键字:分配器 带有 memset std      更新时间:2023-10-16

我有一些安全关键代码,我想确保敏感缓冲区在释放之前总是被擦除。我可以实现一个缓冲区类,它在其析构函数中调用memset_s,但也许还有一种更方便的方法。

如果我用一个在deallocate()中调用memset_s的变量替换std::allocater,这会迫使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());