【问题标题】:Convert str to char* issue将 str 转换为 char* 问题
【发布时间】:2015-03-08 18:00:13
【问题描述】:

我需要将 Str 转换为 char*,但有时会丢失部分字符串。

例如:

str:  "/Users/seb/Pictures/Photos/20141009 - Aulani - Hawaii/20141009_083318_Richtone(HDR).jpg"
char*:  /Users/seb/Pictures/Photos/20141009 - Aulani - Hawaii/20141009_083318_Ri

我正在使用下面的代码:

void TreeWidget::CopyFilesFromLocal(QStringList pathList, QTreeWidgetItem * item) {
    QString fileelt;
    uint32_t Folder_id = INVALID;

    MyTreeWidget* myItem = dynamic_cast<MyTreeWidget*>(item);

    uint32_t destination_id = myItem->mtp_item_id;

    item->setExpanded(true);
    qDebug() << "**************************************";
    qDebug() << "Send to PULS Start";
    qDebug() << "Start of Loop to copy files";

    foreach(fileelt, pathList) {
        char *txt = NULL;
     //   char *isFileName = NULL;
        qDebug() << "str: " << fileelt;
        txt = strdup(m_device.convertQStr2char(fileelt));
        qDebug() << "char*: " << txt;

这是我使用的api。

char *PulsDeviceMngr::convertQStr2char(QString str) {
    return const_cast<char*>(std::string(str.toUtf8().constData() ).c_str());
}

有什么想法吗?

【问题讨论】:

  • 当你说Str时,你的意思是std::string还是QString?这并不重要,因为两者都有非常详细的函数来将 const char* 获取到包含的字符串。
  • 我的意思是 Qstring。我主要将它用于 QString。
  • 如果是 std:string 有什么区别

标签: c++ string qt char qstring


【解决方案1】:

convertQStr2char 返回的指针指向临时std::string 的内部缓冲区,该缓冲区在return 之后被销毁。因此,您使用了一个悬空指针并且具有未定义的行为。

注意,通过该指针改变std::string::c_string()指向的数据也是UB。你的const_cast 是一个非常糟糕的主意,因为即使你的生命周期是正确的,它也会允许这样做。

你可以这样做(包括几个不必要的副本,但先让它工作,然后再担心其余的):

char *PulsDeviceMngr::convertQStr2char(QString str) {
    return strdup(std::string(str.toUtf8().constData() ).c_str());
}

然后不要忘记free 缓冲区。但最好只按值返回std::string,然后在转换函数之外使用.c_str()。这样,你就不需要使用非C++的strdup,也不需要手动管理内存,否则容易出错。

【讨论】:

    【解决方案2】:

    你不需要额外的方法

    txt = strdup(fileelt.toUtf8().constData());
    

    会正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-20
      • 2013-01-04
      • 2016-01-31
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 2019-04-05
      • 2019-03-15
      相关资源
      最近更新 更多