【发布时间】:2016-10-20 11:19:12
【问题描述】:
我想从 std::string 和 std::vector 元素存储的内存中安全地清除(在简单的情况下,将内容设置为零)敏感信息。我的向量还可以包含原始类型(例如 std::vector),所以我想清除向量的析构函数内所有包含的元素会更方便,因为原始类型没有析构函数。我不能用继承覆盖 std::string 和 std::vector 类,因为这些类型不是为此而设计的(没有虚拟析构函数等)。还有其他方法吗?我发现了一些带有 std::string 自动清除的帖子,但那里的示例实现都不完整。目前我在使用完对象后通过手动将内容设置为零来清除我的对象,但这非常乏味。
编辑:以这种方式清除内存也不安全,因为 C++ 容器可以在某些操作期间分配/释放内存。这就是为什么使用分配器(在类似问题中描述)可能是唯一的方法,至少对于不使用 SSO(短字符串优化)的较长字符串。
【问题讨论】:
-
你可以在向量上迭代并在删除它之前将元素设置为 0。
-
@Hayt 由于 as-if 规则,允许编译器忽略此类分配。更多here
-
@Hayt 可能会被优化掉。
-
同样的分配器技巧也适用于
vector。 -
Ib4 “我发现了一些带有 std::string 自动清除的帖子,但那里的示例实现都不完整。” 这并不能说明问题不是骗人的。如果受骗者需要更好的答案,请提供您的理由(需要一些代表,但不多)以吸引更多答案。