C ++ 17 codecvt выдает «плохое преобразование» при преобразовании std :: string в std :: wstring - PullRequest
0 голосов
/ 04 ноября 2019

Я написал строковый класс с именем UString и хочу, чтобы он мог конвертировать std::string в std::wstring, а также конвертировать std::wstring в std::string.

Я использую библиотеку вC ++ 17, поэтому я написал код следующим образом.

В UString.h:

public:
        UString(std::string s);                         
    UString(std::wstring ws);   
private:
    std::string str;                                
    std::string WTS(const std::wstring & wstr);
    std::wstring STW(const std::string & str);
public:
        std::wstring w_str();                           
    const wchar_t* wc_str();

В UString.cpp:

UString::UString(std::string s)
{
    str = s;
}
UString::UString(std::wstring ws)
{
    str = WTS(ws);
}
std::string UString::WTS(const std::wstring & wstr)
{
    std::string ret;
    try {
        std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
        ret = wcv.to_bytes(wstr);
    }
    catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
    }
    return ret;
}
std::wstring UString::STW(const std::string & str)
{
    std::wstring ret;
    try {
        std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
        ret = wcv.from_bytes(str);
    }
    catch (const std::exception & e) {
        std::cerr << e.what() << std::endl;
    }
    return ret;
}
std::wstring UString::w_str()
{
    return STW(str);
}
const wchar_t* UString::wc_str()
{
    return STW(str).c_str();
}

И это должно работатьвот так:

UString ustr="test"; //the value should be "test"
UString ustr2=L"test2"; //the value should be "test2"
wcout<<ustr.w_str()<<endl; //the value should be "test"
cout<<ustr.wc_str()<<endl; //the value should be "test"

В Linux, GCC 8.0.1, класс работает нормально, но в Windows Visual Studio 2017, когда я использую UString::w_str() или UString::wc_str(), он не может работать ивыбросить ошибку "плохое преобразование". Что я должен сделать, чтобы сделать эту работу?

1 Ответ

0 голосов
/ 05 ноября 2019

wc_str() возвращает висячий указатель;любое использование его возвращаемого значения вызывающей стороной демонстрирует неопределенное поведение, когда осуществляется доступ к объекту после окончания его времени жизни.

STW(str) создает временное значение, затем c_str() получает указатель на данные, управляемые этимвременный характер. Затем временное уничтожается, уничтожая данные, и указатель становится висящим.

...