0

我想选择一个文件并将文件名存储为char *我的 QT 表单的成员变量。我有以下

void MainWindow::SelectVolFile(){
    QString qFileName = QFileDialog::getOpenFileName(this, 
        tr("Select VOL file..."), QDir::currentPath(), tr("Files (*.VOL)"));
    if (!qFileName.isEmpty()){
        QByteArray byteFileName = qFileName.toLatin1();
        this->fileName = byteFileName->data();
    }
}

但是,我认为一旦这个函数返回,byteFileName->data()就会超出范围。有什么好的方法可以解决这种情况?我不确定应该将哪个变量放在堆上。

4

4 回答 4

2

这在很大程度上取决于this->fileName. 如果fileName是 a char*,那么您是对的:byteFileName超出范围byteFileName->data()并将被释放,这会导致悬空指针this->fileName.

解决这种情况的最简单方法是将 的类型设置this->fileNameQStringstd::string或者设置实际复制 的内容的其他类型byteFileName->data()

于 2013-03-23T06:49:23.503 回答
1

您可以定义this->filenameQString,它将起作用。

如果你想使用char*文件名,你应该使用new在该函数中分配内存并复制byteFileName->data()到它。

this->filename = new char[strlen(byteFileName->data())+1];
strcpy(this->filename, byteFileName->data());
于 2013-03-23T06:50:36.603 回答
0

最好不要将 qFileName 转换为其他任何内容(fileName 字段必须更改为 QString):

void MainWindow::SelectVolFile(){
    QString qFileName = QFileDialog::getOpenFileName(this, 
        tr("Select VOL file..."), QDir::currentPath(), tr("Files (*.VOL)"));
    if (!qFileName.isEmpty()){
        this->fileName = qFileName;
    }
}

使用您的代码,您将无法正确处理名称包含 latin1 字符集之外的字符的文件。

于 2013-03-23T13:12:39.100 回答
0

一般来说,我可以想到三种可能的解决方案:

  • 复制对象
  • 使用引用计数
  • 移动对象

我会选择最容易与给定库一起使用的那个。

于 2013-03-23T13:21:40.457 回答