Память обнуления, используемая контейнерами STL

Я хотел бы использовать контейнеры STL (плюс std::basic_string) для временного хранения ключей или паролей в памяти, и я хотел бы обнулить память, когда это будет сделано.

Сначала я планировал использовать контейнеры STL, параметризованные на пользовательском распределителе, который обнуляет память в allocator::deallocate, но я предполагаю, что контейнерам разрешено использовать память, которая не поступает из указанного распределителя. Например, представляется целесообразным, чтобы std::vector или std::string содержал элемент массива фиксированного размера, предназначенный для небольших распределений.

Я справедливо обеспокоен, и должен ли я (вздохнуть) написать свой собственный контейнер?

Ответ 1

Я бы использовал std::vector с настраиваемым распределителем, который делает нуль. В соответствии с ответом на May std::vector используйте небольшую оптимизацию буфера?, он не может использовать небольшую оптимизацию буфера и, следовательно, с помощью специального распределителя, вы должны быть безопасно.

Если вы сделаете еще один шаг и используйте этот распределитель для выделения вектора, а затем используйте интеллектуальный указатель, чтобы обеспечить его правильное освобождение (или сделать это вручную), даже внутреннее содержимое вектора (например, размер ) будут уничтожены.

Ответ 2

Вы можете сделать это, выделив строку/вектор, используя необработанную память и место размещения, а затем, когда вы закончите с этим, вызовите деструктор, нулевую память и освободите необработанную память.

Ответ 3

Используйте собственный класс строк, который нули буфер памяти в своем деструкторе.

class zeroed_string : public std::string
{
public:
    ~zeroed_string()
    {
        for (int i = 0; i < size(); ++i)
            (*this)[i] = 0;
    }
// ...
};