将字符串转换为 char* 问题

Convert str to char* issue

我需要将 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());
}

有什么想法吗?

你return形成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缓冲区。但是按值 return std::string 然后在转换函数之外使用 .c_str() 可能会更好。这样,您就不需要使用非 C++ strdup,也不需要手动管理内存,否则很容易出错。

您不需要额外的方法

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

会很好用。