2010-01-21 3 views
0

복잡한 오류가 발생했습니다. 소프트웨어는 PrintParamters를 프린터로 몇 번 전송합니다. 특정 순간에 Parameter Struct의 모든 QString이 손상됩니다 (불량 ptr)QString이 때때로 구조체에 bad-ptr을 갖는 이유는 무엇입니까?

Structs의 QString에 일반적인 문제가 있습니까?

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

param.xname 이미 가지고는 GUI 클래스에서 호출 :

여기
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; 

이 구조체가 사용되는 방법입니다 : 여기

은 내가 사용 구조체입니다 나쁜 ascii ptr !! ? 또한 QString ("abc def 123") 대신 "abc def 123"을 사용하려고했습니다. 하지만 발생하는 동일한 오류의

이 같은 setParam 기능이 모습입니다 : XName이 여전히 그 순간 "8xname = {D = 0x08e2d568}"에서 주소가

RecorderInterface::setParam(RecorderPrintParam *up) 
{ 

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

} 

하지만 xname.ascii가있다 0x00000000의 포인터

+0

또한이 구조체를 사용하는 방법을 나타내는 코드를 게시해야합니다. 예 : 그것은 동적으로 할당됩니까? – Alon

+0

좋아요, 내 게시물 – Christoferw

+0

이러한 정보를 기반으로 어떤 아이디어를 updatet있어? – Christoferw

답변

4

가 적층 된 구조를 만드는 : RecorderPrintParam param 을하고 다른 기능 _recorder->setParam(&param);

UpdateRecorderPrintParameters E로이 구조의 주소를 전달 xxx이 범위를 벗어나 내용이 유효하지 않게됩니다. 힙에 할당하고이 방법으로 캐릭터 생성이 코드 추가 문제가있는 값을 기준으로 또는 통과 param UPDATE

setParam에 GUI가 그 값을 사용하여 수행 될 때 해제 :

QString("abc def 123"); 
누구 참조 과부하 QString= 연산자는 C++ 표준 (12.1)

말에 의해 리턴되는 임시 객체를 생성

함수 호출에서 매개 변수의 임시 바인딩이 표현식이 완료 될 때까지 을 유지합니다. param 객체가 setParam

시도에 전달되기 전에 그래서 QString("abc def 123") 객체의 소멸자가 호출

는 QString STR ("ABC DEF 123")에 QString을 ("ABC DEF 123") 변경; 및 param.xname = str; 또는 param.xname = "abc def 123"

+0

나는 값으로 매개 변수를 전달하기 위해 테스트했지만 동일한 오류가 발생합니다 : ( – Christoferw

+0

param.xname = "abc def 123"-> 나는 이미 이것을 teste했습니다. 이것은 같은 오류를 나타냅니다. 같은..... – Christoferw

+1

내가 생각할 수있는 유일한 다른 설명은 코드의 다른 부분이 스택을 손상시키고 있다는 것입니다. – Alon

관련 문제