STL 容器使用的清零内存

Zeroing memory used by STL containers

本文关键字:内存 STL      更新时间:2023-10-16

我想使用 STL 容器(加 std::basic_string)将密钥或密码临时存储在内存中,我想在完成后将内存清零。

我最初计划使用在自定义分配器上参数化的 STL 容器,该分配器将内存归零allocator::deallocate,但我假设允许容器使用不是来自指定分配器的内存。 例如,std::vectorstd::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;
    }
// ...
};