我正在尝试使用Derelict3在D中构建一个简单的3D游戏引擎。事情进展顺利,直到我开始使用关联数组来映射opengl glGenTextures / glGenBuffers 。为此,我构造了一个简单的结构,其中包含对要绑定的texture / vbo的引用以及从opengl返回的id。然后将其与texture / vbo的散列映射以供稍后检索。
但是,一旦完成设置实际映射,映射就会被魔法删除。我还没理解为什么。下面是我想要实现的一个简单示例,可以观察到相同的行为。
module main;
import std.datetime;
import std.stdio;
class Placeholder {
string value;
this(string value) {
this.value = value;
}
}
private class ResourceInfo {
uint id;
uint time;
Object resource;
static ResourceInfo getOrCreate(Object resource, ResourceInfo[uint] map) {
uint hash = resource.toHash();
ResourceInfo* temp = (hash in map);
ResourceInfo info;
if (!temp){
info = new ResourceInfo();
info.resource = resource;
map[hash] = info;
} else{
info = *temp;
}
// placeholders.lenght is now 1 (!)
info.time = stdTimeToUnixTime(Clock.currStdTime);
return info;
}
}
protected ResourceInfo[uint] placeholders;
void main() {
Placeholder value = new Placeholder("test");
while(true) {
ResourceInfo info = ResourceInfo.getOrCreate(value, placeholders);
// placeholders.lenght is now 0 (!)
if (!info.id) {
info.id = 1; // Here we call glGenBuffers(1, &info.id); in the engine
} else {
// This never runs
writeln("FOUND: ", info.id);
}
}
}
当没有 id 时,手动调用placeholders[value.toHash()] = info
会暂时修复它,但每当我尝试使用object.Error: Access Violation
和_aaApply2
时,我就会开始_d_delclass
几秒钟后访问info
的实例。
有人看到任何明显我失踪的事吗?
答案 0 :(得分:3)
最好我能猜测是未初始化的关联数组的常见伪行为。通过值传递它们然后向它们添加键的含义有效,但仅如果该数组已经初始化。它是实现中的当前边缘情况。尝试使用ref
,但它应该解决问题:
static ResourceInfo getOrCreate(Object resource, ref ResourceInfo[uint] map)