2014-12-17 1 views
-2

오늘 나는 D를 평가하면서 언어를 조금 실험했으며 즉시 세그 폴트를 실행했습니다.템플릿 기반 클래스를 사용할 때 Segfault

import std.stdio; 
import std.typecons; 
class Foo(T){ 
public: 
    T i; 
} 
class Bar{ 
public: 
    int hello = 0; 
} 

void main() 
{ 
    Foo!(Bar) f; 
    int i = f.i.hello; 
} 

왜이 코드가 segfault입니까?

+1

이것이 왜 downvoted되었는지 전혀 모르겠다. 그것은 매우 유효한 질문이다. –

답변

4

D에서 클래스는 기본적으로 참조 유형이며 null로 초기화됩니다. 따라서 변수 'f'는 기본적으로 null이며 'f'가 null이 아니더라도 Foo! (Bar) .i는 기본적으로 null입니다.

'auto f = new Foo! (Bar)()'로 초기화하고 Foo의 생성자에서 'i = new T()'를 초기화해야합니다.

구조체는 기본적으로 값 형식이며 기본값이 아닌 초기화자가 있습니다.

관련 문제