全部
我正在从数据库中以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!
答案 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_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();