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が の場合、その通りchar*です。byteFileName範囲外にbyteFileName->data()なり、割り当てが解除され、ダングリング ポインターが発生しthis->fileNameます。

このような状況を修正する最も簡単な方法は、 のタイプを に設定するthis->fileNameQStringstd::stringのコンテンツを実際にコピーする別のタイプに設定することですbyteFileName->data()

于 2013-03-23T06:49:23.503 に答える
1

this->filenameasを定義することができQString、それは機能します。

char*ファイル名に使用する場合は、newその関数にメモリを割り当ててコピーbyteFileName->data()するために使用する必要があります。

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

一般的に、3 つの可能な解決策を考えることができます。

  • オブジェクトをコピーする
  • 参照カウントを使用する
  • オブジェクトを移動する

指定されたライブラリで最も使いやすいものを選択します。

于 2013-03-23T13:21:40.457 に答える
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 に答える