我收到了一个访问冲突错误:
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);
我希望解决这个问题。如果我自己解决,我会将其作为回答或评论发布。
非常感谢。
答案 0 :(得分:0)
实际问题是Class类的2个成员为null。我试图在其他地方访问它们。我认为它与添加有关的原因很简单,当它没有添加到集合中时,我没有将其他地方称为类。