Преобразование в и из std :: wstring завершается неудачно - PullRequest
0 голосов
/ 13 января 2019

ALL,

Я получаю некоторые данные из базы данных как char *, а затем преобразую их в std :: wstring, потому что мне нужно передать их функции, которая принимает этот тип:

AddDropTable( m_myconv.from_bytes( catalog_name ).c_str(), m_myconv.from_bytes( schema_name ), /*some other params*/);

Внутри AddDropTable мне нужно преобразовать их обратно в char *, потому что мне нужно получить больше информации. Итак, я делаю:

int MyDb::AddDropTable(const std::wstring &catalogName, const std::wstring &schemaName, /*some other params*/)
{
    const char *catalog_name = m_myconv.to_bytes( catalogName.c_str() ).c_str();
    const char *schema_name = m_myconv.to_bytes( schemaName.c_str() ).c_str();
}

m_myconv объявлен как:

std::wstring_convert<std::codecvt_utf8<wchar_t> > m_myconv;

Что странно, так это то, что внутри AddDropTable () имя_каталога пусто (в отладчике оно отображается как «») и имя схемы не возвращается должным образом (отладчик говорит: «Ошибка чтения символов строки»).

Это просто обратное преобразование. Почему не получается?

ТИА!

1 Ответ

0 голосов
/ 13 января 2019
const char *catalog_name = m_myconv.to_bytes( catalogName.c_str() ).c_str();
const char *schema_name = m_myconv.to_bytes( schemaName.c_str() ).c_str();

Метод std::wstring_convert::to_bytes() возвращает данные типа std::wstring_convert::byte_string (псевдоним для std::string) по значению .

Это означает, что правая часть ваших заданий является временной , которая будет уничтожена сразу после каждого оператора. catalog_name и schema_name теперь являются указателями памяти, которая уже была освобождена. Использование этих указателей неопределенное поведение .

Чтобы исправить это, сохраните результат в строке, которая переживет оператор:

std::string catalog_name_str = m_myconv.to_bytes( catalogName.c_str() );
std::string schema_name_str = m_myconv.to_bytes( schemaName.c_str() );

Теперь вы можете получить указатели на C-строку и использовать их в рамках тела функции:

const char *catalog_name = catalog_name_str.c_str();
const char *schema_name = schema_name_str.c_str();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...