gpt4 book ai didi

c++ - 将字符串转换为 char* 问题

转载 作者:行者123 更新时间:2023-11-30 01:49:32 24 4
gpt4 key购买 nike

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

有什么想法吗?

最佳答案

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());
}

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

关于c++ - 将字符串转换为 char* 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28929918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com