【问题标题】:Access Violation - Associative Array访问冲突 - 关联数组
【发布时间】:2014-10-17 18:26:01
【问题描述】:

我收到访问冲突错误:

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 的成员或者是因为 class.我知道它通常会在无效的内存访问期间发生,但是强制转换不应该也抛出异常吗?

我错过了什么吗?

newClass 不为空,但声明如下:

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

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

非常感谢。

【问题讨论】:

  • 发现了问题,与此无关。当我声明这条线时它并没有发生,但它是在另一个调用它时发生的。
  • 您能否也将解决方案发布为答案,以便搜索此内容的人会看到它?谢谢

标签: associative-array access-violation d dmd


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-11-16
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多