【发布时间】:2016-01-25 10:20:21
【问题描述】:
我有一个字符串变量(包含密码),并会在释放变量之前like to overwrite it's value with a sequence of '0'。我坚持做这样的事情:
void overwrite(std::string &toOverwrite){
if(toOverwrite.empty())
return;
else{
std::string removeString;
size_t length = toOverwrite.size();
for(int i = 0; i < length; i++){
removeString += "0";
}
toOverwrite = removeString;
}
}
但不知何故,这感觉不对。
- 首先是因为它似乎在 for 循环中产生了很多开销。
- 此外,我不确定最后一行是否真的会覆盖字符串。我知道,例如在 Java 中,字符串是不可变的,因此根本不能被覆盖。它们在 C++ 中不是不可变的(至少不是 std::string),但
toOverwrite = removeString会真正替换toOverwrite或者只是让toOverwrite的“指针”指向removeString? - 我的编译器有可能会optimize the code and removes this overwriting吗?
也许我应该使用std::string::replace 方法或将数据类型更改为char* / byte[]?
【问题讨论】:
-
就循环开销而言,您可以使用
std::string removeString(toOverwrite.size(), '0');初始化您的字符串——但这不会解决您的第二个和第三个问题。