2017-04-19 5 views
1

なぜコール後c_str()unique_ptrは有効なwstringを指さないのですか?c_str()を呼び出した後のunique_ptrが有効な値を指していません

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

をところで、あなたは 'に.getを使用する必要はありません() - >' 'のstd :: unique_ptr'に。 ' - >'だけでもうまくいくでしょう。 – aschepler

+1

ここで 'std :: unique_ptr'をなぜ使用していますか?なぜ 'std :: wstring'だけではないのですか? – Galik

+0

私はあなたに同意しますunique_ptrここでは有用ではありません。 – Xor

答えて

1

DecryptString(&EncryptString(encrypt)[0])すぐstatememt後に破壊される一時std::unique_ptrを返します。すなわち

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 
関連する問題