【问题标题】:Terminate called after throwing an instance of 'char const*'抛出 'char const*' 的实例后调用终止
【发布时间】:2013-06-13 14:59:55
【问题描述】:

我创建了一个简单的隐写库,并尝试创建一个小型 Qt 5.0.2 应用程序来测试它。它由两个用于存储和显示路径名的 textEdits 和两个弹出文件对话框以选择文件 txt 和 bmp 的按钮组成,以允许将前者“嵌入”到后者中。

但是当我单击“生成”按钮时,它会抛出“在抛出 'char const*' 的实例后调用终止。

void MainWindow::on_generate_clicked()
{
    BmpFile bm(MainWindow::bmpName);
    char *outputFile = "test1.bmp";

    if( bm.hide(MainWindow::bmpName, MainWindow::txtName, outputFile) == 0 )
    {
        printf("Hidding done.\n");
    }
    else
    {
        printf("Error!");
    }
}

是引发错误的 Qt 槽。

void MainWindow::on_selFile_clicked()
{
    QString txtname(MainWindow::txtName);
    txtname = QFileDialog::getOpenFileName(this, tr("Open file"),"",tr("Files (*.txt)"));
    ui->fileBox->setText(txtname);
    QByteArray ba = txtname.toLocal8Bit();
    MainWindow::txtName = ba.data();
}

void MainWindow::on_selBitmap_clicked()
{
    QString bmpname=(MainWindow::bmpName);
    bmpname = QFileDialog::getOpenFileName(this, tr("Open file"),"",tr("Files (*.bmp)"));
    ui->bmpBox->setText(bmpname);
    QByteArray ba = bmpname.toLocal8Bit();
    MainWindow::bmpName = ba.data();
}

是处理和存储这两个文件的两个槽

this 是图书馆。

我感觉这与转换为 QString 并返回有关,但我不确定。

【问题讨论】:

  • 您能说得更具体些吗?发生错误时您在调用什么?具体的错误文本是什么?后两个插槽如何影响问题?请编辑问题以提供这些细节。
  • @CoryKlein 我已编辑以反映更改。
  • 我预计它会抛出 "("文件不退出或文件名错误。\n");"来自您的外部图书馆。
  • @drescherjm 我已经尝试过处理多个文件和不存在的文件,并且该错误消息仅在这些情况下抛出。
  • 这并不意味着重写库。这意味着您在构造 bm 时从 QString 转换为 const char*。

标签: c++ qt exception char


【解决方案1】:

根据对 OP 的讨论,我建议您将文件名保留为 QString。替换 char* bmpName;与 QString strBmpName;在你的标题中。然后将 QString 转换为下一行的 char*。

BmpFile bm(MainWindow::bmpName);

QByteArray ba = strBmpName.toLocal8Bit();
BmpFile bm(ba.data());

【讨论】:

  • const_cast,可能不是reinterpret_cast
  • 我会找些草料回来找你的。谢谢。
  • 你绝不能使用toLocal8Bit().data()data() 返回一个缓冲区,只要它的所有者(QByteArray)还活着,它就会活着。而 QByteArray 是临时的,会在data() 调用后立即销毁。因此,在您尝试使用缓冲区时,缓冲区可能无效。实际上我有时会遇到这种效果(当然,这取决于编译器和优化标志)。
  • 我删除了关于需要 const_cast 的部分,因为在这种情况下这不是必需的。从这里qt-project.org/doc/qt-4.8/qbytearray.html#data
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 2011-05-13
  • 1970-01-01
  • 2021-01-02
  • 2019-05-04
  • 2018-01-06
相关资源
最近更新 更多