Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安全地调整和删除std::string_String_Security_Visual C++_Resize - Fatal编程技术网

安全地调整和删除std::string

安全地调整和删除std::string,string,security,visual-c++,resize,String,Security,Visual C++,Resize,我有一个包含字符串的类。目前,它是一个std::wstring,但不一定是。我已经读到不应该使用std::string,但我想知道这样做是否有效: if (aString.length() == aString.capacity() ) { std::wstring oldString = aString; aString = wstring(aString); aString.reserve(PREALLOCATION_AMOUNT); SecureZeroMe

我有一个包含字符串的类。目前,它是一个std::wstring,但不一定是。我已经读到不应该使用std::string,但我想知道这样做是否有效:

if (aString.length() == aString.capacity() )
{
    std::wstring oldString = aString;
    aString = wstring(aString);
    aString.reserve(PREALLOCATION_AMOUNT);
    SecureZeroMemory((PVOID)oldString.c_str(),oldString.size());
    oldString.clear();
}

这基本上等同于字符串缓冲区的安全realloc吗?如果没有,是否有更好的解决方案?

不能保证
c_str()
将指向原始缓冲区而不复制。这可能就是它的工作方式,但是如果不查看
basic\u string
的具体实现,就无法确定


使
std::wstring
安全有足够多的潜在问题,因此我会完全避免它,并找到一个安全的字符串类或编写自己的。

我不知道这是否真的有效,但也许您可以尝试以下方法:

#include <algorithm>
#include <string>

// ...

std::string password = "sekrit";
std::fill(password.begin(), password.end(), 0);
#包括
#包括
// ...
std::string password=“sekrit”;
std::fill(password.begin(),password.end(),0);
当然,这是假设您的字符串从未调整大小。如果是,您将无法访问存储字符串开头的内存。正如其他人所指出的,这可能是个坏主意