0

我整天都在与这个作斗争,我尝试以许多不同的方式传递一个 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 调用上 SEGFAULTs。我什至尝试了一个简单的 int& 作为参数但没有成功。但是,我可以毫无问题地将参数作为 const QString& 传递。我只是不能那样修改参数的值。

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

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

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

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

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

1 回答 1

1

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

这似乎表明它在那条线上有故障。如果参数有问题,我预计它会在函数内出错。ExecuteQuery

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

于 2013-05-08T01:02:27.553 回答