0

我有一个复杂的错误。该软件将 PrintParamters 发送到打印机几次。在某个时刻,参数结构的所有 QString 都被破坏(坏 ptr)

Structs 中的 QStrings 是否存在一般问题?

这是我正在使用的结构:

typedef struct RecorderPrintParam {
  ES_DataType xxxxxxxxxx;
  bool  xxxxxxxxxxx;
  bool  xxxxxxxxxxxx;
  bool  xxxxxxxxxxxx;
  int      xxxxxxxxxxxxxxxxxxxxxx;
  double   xxxxxxxxxxxxxxx;
  double   xxxxxxxxxx;
  bool     xxxxxxxxxxx;
  int   xxxxxxxxxxxxxxx;
  double  xxxxxxxxxxx;
  bool     xxxxxxxxxxx;
  bool  xxxxxxxxxx;
  double  xxxxxxxxx;
  QString  xname;
  QString  yname;
  QString  anotherValue;
  QString  opername;
  QString  region;
  QString  application;
  QString  version;
  AxisUnit axUnit ;
  double  axLenM;
  double  xxxxxxxx;
  double  xxxxxxxx;

  int     xxxxxxxx;
  double  xxxxxxxxx;
  double  xxxxxxxxx;

  bool  xxxxxxxxxxxxxxx; /

  double  xxxxxxxxxxxxxxx;  

  double  xxxxxxxxxx;
  bool   xxxxxxxxx;

 }RecorderPrintParam;

以下是该结构的使用方式:从 GUI 类调用:

void 
MyDlg::UpdateRecorderPrintParameters()
{
       RecorderPrintParam param;
       ....
       ....
       param.xname  = QString("abc def 123");
       _recorder->setParam(&param);
}

param.xname 已经有一个错误的 ascii ptr !? 我还尝试使用 just = "abc def 123" 而不是 = QString("abc def 123"); 但它发生了同样的错误

这就是 setParam 函数的样子:

RecorderInterface::setParam(RecorderPrintParam *up)
{

....
...
if(up->xname.compare(_myParams.xname)!=0 ) _newHeaderPrint=true;
...
...
}

}

那个时候xname还有一个地址“8xname = {d=0x08e2d568 }”,但是xname.ascii有一个0x00000000指针

4

1 回答 1

4

您正在堆栈中创建一个结构: RecorderPrintParam param 然后将此结构的地址传递给另一个函数_recorder->setParam(&param);

UpdateRecorderPrintParameters退出param超出范围并且其内容变得无效时。在堆中分配它并在 GUI 使用其值完成时释放它,或param按值传递给setParam

更新 此代码以这种方式创建字符串还有一个问题:

QString("abc def 123"); 

创建一个临时对象,其引用由QString =C++ 标准说 (12.1) 的重载运算符返回

临时绑定到函数调用中的引用参数会一直持续到包含调用的完整表达式完成为止。

所以对象的析构函数在对象被传递给 QString("abc def 123")之前被调用paramsetParam

尝试将 QString("abc def 123") 更改为 QString str("abc def 123"); 和 param.xname = str;param.xname = "abc def 123"

于 2010-01-21T09:15:33.123 回答