调用c_str()后,unique_ptr不指向有效值

时间:2017-04-19 04:19:47

标签: c++

为什么在调用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;
}

1 个答案:

答案 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