通过引用将QString传递给库函数时出现SEGFAULT



我一整天都在与这个作斗争,我试过传递一个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);
}

在bmdbTest->ExecuteQuery调用上出现segfault。我甚至试过一个简单的int&作为没有成功的参数。然而,我可以通过const QString&没有问题。我只是不能那样修改参数的值。

编辑:我刚刚明白了。感谢"paxdiablo"建议我检查变量是否为空或无效指针。我昨晚真的很累,我不敢相信我错过了这个。

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

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

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

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

您可能需要检查bmdbTest本身的值。可以为空或无效指针。

这似乎是由上的行错误的事实表明的。如果参数有什么可疑之处,我希望它在 ExecuteQuery函数中故障

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

相关内容

最新更新