与std :: wstring之间的转换失败

时间:2019-01-13 07:27:46

标签: c++ c++11

全部

我正在从数据库中以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()中的catalog_name内部为空(在调试器下,它显示为“”),而schema_name没有正确返回(调试器说:“读取字符串字符时出错”)。

这只是一个来回转换。为什么会失败?

TIA!

1 个答案:

答案 0 :(得分:0)

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_stringstd::string的别名)的数据,按值

这意味着您的作业的右侧是临时,在每条陈述后都会立即销毁。 catalog_nameschema_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();