确保文件名不超出范围

时间:2013-03-23 06:43:19

标签: c++ qt filenames

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

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 个答案:

答案 0 :(得分:2)

这在很大程度上取决于this->fileName。如果fileNamechar*,那么您是对的:byteFileName超出范围,byteFileName->data()将被取消分配,这会导致悬空指针,{{1} }。

解决此类情况的最简单方法是将this->fileName的类型设置为this->fileNameQString或实际复制std::string内容的其他类型。< / p>

答案 1 :(得分:1)

您可以将this->filename定义为QString,它会起作用。

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

this->filename = new char[strlen(byteFileName->data())+1];
strcpy(this->filename, byteFileName->data());

答案 2 :(得分: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字符集之​​外的字符的文件。

答案 3 :(得分:0)

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

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

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