我想使用 STL 容器(加号std::basic_string
)将密钥或密码临时存储在内存中,并且我想在完成后将内存归零。
我最初计划使用在自定义分配器上参数化的 STL 容器,该分配器将内存归零allocator::deallocate
,但我假设容器被允许使用不是来自指定分配器的内存。例如,astd::vector
或 astd::string
包含一个用于小分配的固定大小的数组成员似乎是合理的。
我是否正确地担心,我应该(叹息)编写自己的容器吗?
我想使用 STL 容器(加号std::basic_string
)将密钥或密码临时存储在内存中,并且我想在完成后将内存归零。
我最初计划使用在自定义分配器上参数化的 STL 容器,该分配器将内存归零allocator::deallocate
,但我假设容器被允许使用不是来自指定分配器的内存。例如,astd::vector
或 astd::string
包含一个用于小分配的固定大小的数组成员似乎是合理的。
我是否正确地担心,我应该(叹息)编写自己的容器吗?
我会使用std::vector
一个自定义分配器来进行归零。根据May std::vector 的答案,使用小缓冲区优化?,它不能使用小缓冲区优化,因此,使用自定义分配器,你应该是安全的。
如果您更进一步,并使用该分配器来分配向量,然后使用智能指针来确保它正确释放(或手动执行),即使是向量的内部内容(例如大小)也将是歼灭。
您可以通过使用原始内存和放置 new 分配字符串/向量来做到这一点,当您完成它时,调用析构函数、零内存并释放原始内存。
使用自定义字符串类,将其析构函数中的内存缓冲区归零。
class zeroed_string : public std::string
{
public:
~zeroed_string()
{
for (int i = 0; i < size(); ++i)
(*this)[i] = 0;
}
// ...
};