【发布时间】: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