访问冲突 - 关联数组

时间:2014-10-09 09:12:02

标签: associative-array access-violation d dmd

我收到了一个访问冲突错误:

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;
}
}

我在想它可能是Class的一些成员?说实话,我不知道。

像这样调用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);

我希望解决这个问题。如果我自己解决,我会将其作为回答或评论发布。

非常感谢。

1 个答案:

答案 0 :(得分:0)

实际问题是Class类的2个成员为null。我试图在其他地方访问它们。我认为它与添加有关的原因很简单,当它没有添加到集合中时,我没有将其他地方称为类。