std::带有memset_s分配器的矢量
std::vector with memset_s allocator
我有一些安全关键代码,我想确保敏感缓冲区在释放之前总是被擦除。我可以实现一个缓冲区类,它在其析构函数中调用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());
相关文章:
- C++11 个有状态分配器,带有 std::basic_string<> g++ 6.3.0
- 如何将带有自定义分配器的 std::vector 传递给期望带有 std::分配器的函数?
- 带有 clang++ v4 和 gcc 6.3 库的自定义分配器
- 不调用带有 std::vector 的自定义分配器
- C 使用分配器和初始化剂,并带有升压圆形缓冲液
- 带有STD ::向量的模板Typedef具有自定义分配器
- 带有realloc的自定义池内存分配器
- 带有自定义分配器的std::string
- 请求提升池体验.它作为带有预分配的分配器有用吗
- 带有 STL 向量的模板函数会因新的分配器而中断
- std::带有memset_s分配器的矢量
- 带有容器和默认分配器的模板模板参数:我可以让我的声明更紧凑吗
- 带有编译时数组的自定义分配器
- 使用带有分配器的 boost::lockfree::spsc_queue
- 使用带有自定义对齐分配器实现的最新g++,使用SSE和-O3选项编译时出现非法指令(核心转储)
- 带有自定义deleter和分配器的shared_ptr
- 从一个带有一个分配器的向量移动到另一个带有分配器的向量
- 在std::scoped_allocator_adaptor中使用带有std::unordered_map的自定义分配器
- 带有嵌入式竞技场的堆栈分配器的问题
- 使用带有boost::bimap的自定义分配器