2012-11-07 6 views
4

과 세그먼테이션 폴트 (segfault) 그래서 주제 라인에 언급 된 코드는 Qt는 4.8.3 & GCC 4.7.2const QList <int> warnings = QList <int>() << 0; GCC 4.7.2

이 어떤 클래스/통화 당 파일에서 구조체의 외부에 있고 작동과 분할 오류가 발생합니다 GCC 4.4

const QList<int> warnings = QList<int>() << 0 << 3 << 7; 

흔적이 두 가지 힌트를 제공합니다

__do_global_ctors() 
__static_initialization_and_destruction_0 

그래서 그것의 그것으로 후자의 목록을 삽입 할 때 "경고"아직 사용할 수없는 것 같다. 4.7.2와

작품 나는이로 변경하는 경우 :

global scope: QList< int> warnings; 

이 어떤 기능 inisde이다 : 이런 일이 발생하는 이유는

warnings = QList<int>() << 0 << 3; 

을 궁금하네요?

편집 :

내가 원래 내 질문에서 조금 너무 많은 물건을 잘린 생각하지만, 경고가 무리 열거를 유지하기위한 파일 범위 (.CPP 파일)에서 const를 할 예정이다.

+1

이것은 매우 사소한 것처럼 보일 수 있습니다. 표현식은'const QList warnings = (QList () << 0 << 3 << 7);)로 해결됩니까? – Acorbe

+0

또한'const QList warnings = QList << 0 << 3 << 7;'? (생성자를 호출 할 괄호는 없습니다.) – Acorbe

+0

'int i = int << 1; '을 쓰는 것과 거의 같을 것입니다. 컴파일되지 않을 것입니다. – jrok

답변

6

저의 초능력 디버깅 능력은 문제의 라인이 클래스/기능 범위가 아닌 전역/파일 범위에 있다는 것을 알려줍니다. 따라서 정적 초기화 중에는 언제든지 라인을 호출 할 수 있습니다. 이전 gcc에서는 QT가 으로 초기화되고 전에 전화를 걸었습니다. 새로운 gcc에서는 QT가 객체를 만들고이를 삽입 할 준비가되기 전에 함수를 먼저 호출하기 위해 정적 초기화를 재정렬했습니다 (완벽하게 유효합니다).

해결 방법은 main이 시작될 때까지 QList을 생성하는 것을 보류하는 것입니다. 포인터 또는 정적 로컬 객체 사용은 두 가지 일반적인 구현입니다.

+0

당신이 옳다고 생각합니다. 그 두 (do_global_ctors ..) 함수를 전역/파일 범위에 대한 정적 초기화 일을 스택에서. 내가 상속 한 코드를 기본 const qlist 그것으로 가득 차있다. – turska

+2

+1 나는 심령 디버거를 좋아합니다. 누구나 사본을 받아야합니다. :) –

관련 문제