Память обнуления, используемая контейнерами 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;
}
// ...
};