为什么在调用c_str()之后unique_ptr不再指向有效的wstring?
wstring encrypt = L"hello";
LPCWSTR decrypted = DecryptString(&EncryptString(encrypt)[0]).get()->c_str();
unique_ptr<wstring> DecryptString(LPCWSTR str)
{
unique_ptr<wstring> decryptedStr = make_unique<wstring>();
decryptedStr.get()->resize(wcslen(str) / sizeof(WCHAR) + 1);
wstring key = L"123";
for (int i = 0; i < wcslen(str) / sizeof(WCHAR); i++)
{
(*decryptedStr.get())[i] = str[i] ^ key[i % key.size()];
}
return decryptedStr;
}
答案 0 :(得分:1)
DecryptString(&EncryptString(encrypt)[0])
返回一个临时std::unique_ptr
,它将立即在statememt之后销毁。即。
LPCWSTR decrypted = DecryptString(&EncryptString(encrypt)[0]).get()->c_str();
// the temporary std::unique_ptr has been destroyed here,
// the wstring managed by it was destroyed too
// decrypted is dangled now
您可以改为使用名为std::unique_ptr
:
{
auto p = DecryptString(&EncryptString(encrypt)[0]);
LPCWSTR decrypted = p.get()->c_str();
...
}
// p and the wstring managed by it is destroyed here