【问题标题】:SEGFAULT when passing QString by refernce to library function通过引用库函数传递 QString 时的 SEGFAULT
【发布时间】:2013-05-08 00:50:14
【问题描述】:

我整天都在与这个作斗争,我尝试以许多不同的方式传递一个 QString、一个 std::string 和一个 char*,但如果我传递它以便我可以修改参数的库函数中的值,然后是 SEGFAULTs。如果我将库函数逐行复制到主应用程序中,我可以整天将引用作为参数传递并在函数内更改它们的值。

这是我在库中的函数的精简版。 我已经从字面上删除了除此行之外的所有代码。

MySQLLib::ExecuteQuery(const QString& query, QString& results)
{
  results = "Changed the value of this parameter.";
}

这是来自主应用程序的调用代码。 bmdbTest 是上述 MySQLLib 类的一个实例... 我的库和应用程序中的所有其他代码都有效。它只是不允许我将对任何东西的引用传递给我的图书馆。

MySQLProj::pbExecuteQuery_Click()
{
  QString x = "Hello.";
  bmdbTest->ExecuteQuery("SELECT ttid from test_table", x);
  ui_MySQLProj1.textEdit->setText(x);
}

它 SEGFAULTs 在 bmdbTest->ExecuteQuery 调用上。 我什至尝试了一个简单的 int& 作为参数但没有成功。 但是,我可以毫无问题地将参数作为 const QString& 传递。我就是不能那样修改参数的值。

编辑:我刚刚想通了。感谢“paxdiablo”建议我检查我的变量是否存在空指针或无效指针。昨晚我真的很累,我不敢相信我错过了这个。

我刚刚发现了问题,我觉得自己像个白痴。您提到 bmdbTest 为空或无效。 bmdbTest 的值很好,因为我的所有其他函数都可以正常工作,但是当我调用 ExecuteQuery() 时,我从我的 GUI 窗口中的 QLineEdit 中的值传递查询字符串,就像这样。

bmdbTest->ExecuteQuery(leQuery->text(), resultString);

leQuery->Text() 实际上是问题所在,因为我必须像这样访问 leQuery。

bmdbTest->ExecuteQuery(ui_MySQLProj1.leQuery->text(), resultString);

【问题讨论】:

    标签: qt parameters reference shared-libraries


    【解决方案1】:

    您可能想检查bmdbTest 本身的值。它可能是 null 或无效的指针。

    这似乎表明它在 that 行上有错误。如果参数有问题,我预计它会在ExecuteQuery 函数出错。

    您应该能够准确地通过在results = ...bmdbTest->ExecuteQuery(...) 行的任一侧放置适当的调试语句(带有刷新)来找出崩溃的位置(或者使用调试器,如果你有一个)。

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2020-10-02
      • 2014-07-12
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多