0

複雑なエラーが発生しました。ソフトウェアは PrintParamters をプリンターに数回送信します。ある時点で、パラメーター構造体のすべての QString が壊れています (bad 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 があります !! ? また、 = QString("abc def 123"); の代わりに = "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);

UpdateRecorderPrintParametersexitparamが範囲外になり、その内容が無効になったとき。ヒープに割り当て、GUI がその値を使用して終了したときに解放するか、値で渡しparamますsetParam

UPDATE この方法で文字列を作成するこのコードには、追加の問題があります。

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 に答える