我有一些安全关键代码,我想确保在释放之前始终擦除敏感缓冲区。我可以实现一个在其析构函数中调用memset_s的缓冲类,但也许有一种更方便的方法。
如果我用一个在deallocate()中调用memset_s的变量替换std :: allocator,那么强制std :: vector不会在除临时状态之外的任何地方分配T对象吗?
感谢。
答案 0 :(得分:2)
有两个原因可以让你拥有这样的T对象:作为向量的元素,或者出于其他原因。
它们不能成为向量的元素,因为它会违反连续性,并且会违反swap
的无投掷保证。如果由于其他原因而有元素,则必须构造具有可观察复杂性的元素。此外T::T()
可能无法使用(DefaultConstructable
不是必需的),或者它可能会抛出哪个也是可观察到的效果。
因此,一般来说vector
不能隐藏"元件。
答案 1 :(得分: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());