2014-10-09 9 views
1

나는이에서 액세스 위반 오류가 발생합니다 :액세스 위반 - 연관 배열

classes[newClass.name] = newClass; 

전체 메소드 코드 :

void initClass(Class newClass) { 
    synchronized { 
     auto classes = cast(Class[string])classDeclarations; 
     classes[newClass.name] = newClass; 
     classDeclarations = cast(shared(Class[string]))classes; 
    } 
} 

classDeclarations이 같은 선언이 :

private shared Class[string] classDeclarations; 

그것은이 그래도 내 프로그램에서 일찍부터 일했다. 액세스 위반이 newClass의 멤버 때문이거나 클래스 때문일 수 있습니다. 나는 그것이 일반적으로 잘못된 메모리 액세스 중에 발생하는 것이지만 캐스팅도 예외를 던져서는 안된다는 것을 알고 있습니까?

나는 뭔가를 놓친가요?

합니다 NewClass은 null이 아닌 있지만 다음과 같은 선언 것 :

class Class : Variable { 
private: 
bool hasInit = false; // when constructor is called this is set to true ... 
public: 
Class[string] bases; 
Variable[string] variables; 
Task[string] tasks; 
string typeName; // class name, not var name ... 

Task constructor; 
Task destructor; 

this() { 
    super(VariableType.Class); 
} 

void setBaseData(Class baseClass) { 
    foreach (var; baseClass.variables.values) { 
     variables[var.name] = var; 
    } 
    foreach (task; baseClass.tasks.values) { 
     tasks[task.name] = task; 
    } 
} 

override bool isNull() { 
    return hasInit; 
} 

override Class copy() { 
    auto newClass = new Class; 
    newClass.typeName = typeName; 
    foreach (b; bases.values) { 
     auto newBase = b.copy(); 
     newBase.name = b.name; 
     newClass.bases[newBase.name] = newBase; 
    } 
    foreach (v; variables.values) { 
     newClass.variables[v.name] = v.copy(); 
    } 
    foreach (t; tasks.values) { 
     newClass.tasks[t.name] = t.copy(); 
    } 
    newClass.typeName = typeName; 
    newClass.mutable = mutable; 
    newClass.constructor = constructor.copy(); 
    newClass.destructor = destructor.copy(); 
    return newClass; 
} 

override int sizeOf() { 
    int res = 0; 
    foreach (b; bases.values) 
     res += b.sizeOf(); 
    foreach (v; variables.values) 
     res += v.sizeOf(); 
    return res; 
} 
} 

나는 그것이 클래스의 멤버들을 수 있습니다 생각? 솔직히 말해서, 나도 몰라.

initClass가 이와 같이 호출되고 모든 데이터가 초기화됩니다.

auto newClass = new Class; 
        newClass.name = tokenizer.name; 
        newClass.typeName = tokenizer.name; 
        foreach (base; tokenizer.baseNames) { 
         if (classExists(base)) { 
          auto baseClass = getNewClass(base); 
          baseClass.name = base; 
          newClass.bases[base] = baseClass; 
          newClass.setBaseData(baseClass); 
         } 
        } 
        initClass(newClass); 

이 문제를 해결하기 바랍니다. 내가 직접 해결할 경우 답변이나 의견으로 게시 할 것입니다.

고마워요.

+0

발견 된 문제는 그와 관련이 없습니다. 내가 선을 선포했을 때 일어난 것은 아니지만, 다른 선상에 있었다. – Bauss

+0

솔루션을 답변으로 게시해도 검색 대상자가 볼 수 있습니까? 고마워 –

답변

0

실제 문제는 null 인 클래스 클래스의 2 멤버입니다. 나는 다른 곳에서 그들에게 접근하려고 노력했다. 내가 추가와 관련이 있다고 생각한 이유는 단순히 컬렉션에 추가되지 않은 다른 클래스를 클래스라고 부르지 않았기 때문입니다.