Почему QString в структуре иногда плохой ptr? - PullRequest
0 голосов
/ 21 января 2010

У меня сложная ошибка.Программное обеспечение отправляет PrintParamters на принтер пару раз.В определенный момент все QStrings структуры параметров не работают (плохой ptr)

Есть ли общая проблема с QStrings в Structs?

вот структура, которую я использую:

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 !!?Я также попытался использовать 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

1 Ответ

4 голосов
/ 21 января 2010

вы создаете структуру в стеке: RecorderPrintParam param а затем вы передаете адрес этой структуры в другую функцию _recorder->setParam(&param);

когда UpdateRecorderPrintParameters выходит param выходит из области видимости и его содержимое становится недействительным. Выделите его в куче и отпустите, когда GUI будет сделан, используя его значения, или передать param по значению setParam

ОБНОВЛЕНИЕ существует дополнительная проблема с этим кодом, создающая строку таким образом:

QString("abc def 123"); 

создает временный объект, ссылка на который возвращается перегруженным оператором QString = стандарты C ++ говорят (12.1)

временная привязка к ссылке параметр в вызове функции сохраняется до завершения полного выражение, содержащее вызов.

поэтому деструктор для объекта QString("abc def 123") вызывается до того, как объект param передан в setParam

попытаться изменить QString ("abc def 123") на QString str ("abc def 123"); и param.xname = str; или param.xname = "abc def 123"

...