2012-05-28 2 views
2

QString 멤버가 필요한 사용자 지정 예외를 개발 중입니다.Qt : QString을 예외 클래스의 멤버로 사용할 수 있습니까?

class MyException 
{ 
private: 
    const QString fDescription; 

public: 
    MyException(QString desc); 
}; 

MyException::MyException(QString desc) : fDescription(desc) 
{} 

것은 내가 그것을 사용하려고하면 : 같은 뭔가

if (isErrorEncountered) 
{ 
    MyException e(QString("Descriptive message here...")); 
    throw e; 
} 

나는 세그먼트 오류를 ​​얻을. 여기에 설명 된 증상이 유사 : Qt QString cloning Segmentation Fault

SIGSEGV가 QString::QString(const QString &other)에서 오는 QBasicAtomicInt::ref에서 유래.

복사 생성자 내에서 유효하지 않은 QString을 복사하려고 시도하는 것처럼 보입니다. QString은 유효한 참조가있는 한 그 내용에 대한 포인터를 유지한다는 것을 이해합니다. MyException 인스턴스의 복사본이 만들어지면 임시 스택 인스턴스가 범위를 벗어나 복사본이 성공해야한다는 사실이 사실입니까?

QString 멤버없이 MyException을 구현하면 모든 것이 잘 작동합니다.

+0

왜'std :: string'cut이 아닌가? – TeaOverflow

+0

'value'는 샘플 예외의 전역 객체 또는 오타입니까? QString에 대한 예외가 확실합니까? 왜 당신의 예외 생성자는'const &'를 취하지 않습니까? – Mat

+0

나는 똑같은 문제가 있었다. QString의 암묵적인 공유 메커니즘과 관련이있다. @Evgeni 네, 그래서'char *'; 그러나 그것은 그 질문과 아무 관련이 없습니다. – cmannett85

답변

1

질문에 대한 대답은 "그렇습니다. QString은 안전하게 예외 멤버 일 수 있습니다."

내가 직면 한 문제는 fDescription의 데이터 원본으로 사용되는 개체에 버그가 있다는 사실 때문이었습니다. 그것은 getter 메소드 구현 : 물론

class Source 
{ 
private: QString fData; 
public: QString GetData(void) { this->fData; } // There is a missing return 
} 

을,이 호출의 결과는 순간에 스택 따라서 SIGSEGV에 상주하는 임의의 값이었다.

QString은 예상대로 작동하고 유효한 참조를 사용하여 예외에서 사용하는 데 문제가 없습니다.

SIGSEGV가 발생한 정확한 지점은 try 블록의 범위를 벗어나 예외의 사본이 생성되는 곳입니다 (기억 : throw by value, catch by reference). 기본 복사 생성자는 모든 멤버의 단순 복사본을 만들려고 시도하고 잘못된 QString 참조에 액세스하지 못합니다.

+1

+1 완전한 간단한 재현 사례를 구축하는 가치를 입증하기 위해 ... 또한 유의하십시오. 질문을 수락 할 때 자신의 대답을 표시 할 수 있습니다! – HostileFork

관련 문제