나는이에서 액세스 위반 오류가 발생합니다 :액세스 위반 - 연관 배열
이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);
이 문제를 해결하기 바랍니다. 내가 직접 해결할 경우 답변이나 의견으로 게시 할 것입니다.
고마워요.
발견 된 문제는 그와 관련이 없습니다. 내가 선을 선포했을 때 일어난 것은 아니지만, 다른 선상에 있었다. – Bauss
솔루션을 답변으로 게시해도 검색 대상자가 볼 수 있습니까? 고마워 –