Sé que std::array
está completamente asignado en la pila, pero esta pregunta está motivada por preocupaciones de seguridad que requieren dos cosas:
- Los datos
std::array
serán zerod o aleatorios en la destrucción. - Los datos
std::array
se bloquearán , de modo que nunca irán al disco ni en caso de bloqueo ni de memoria de intercambio
Generalmente, con std::vector
, la solución es crear un asignador personalizado que haga estas cosas . Sin embargo, para std::array
, no veo cómo hacer esto, y de ahí esta pregunta.
Lo mejor que puedo hacer es esto:
template <typename T, std::size_t Size>
struct SecureArray : public std::array<T, Size>
{
static_assert(std::is_pod<T>::value, "Only POD types allowed")
static_assert(sizeof(T) == 1, "Only 1-byte types allowed")
virtual ~SecureArray()
{
std::vector<uint8_t> d = RandomBytes(Size); // generates Size random bytes
std::memcpy(this->data(), d.data(), Size);
}
}
Pero esto obviamente carece de bloqueo de memoria y complica el esquema de rendimiento std::array
que se debe obtener al usar std::array
en primer lugar.
¿Hay alguna solución mejor?