我不会深入研究这个问题(代码库已经有数千行而且相当复杂),所以我会尝试将..."窗口"我所发现的。
这是例行触发"分段错误" :
extern (C)
{
void* Statements_new() { return cast(void*)(new Statements()); }
void Statements_add(Statements s, Statement st)
{
//writeln("In here");
if (s is null) writeln("StatemenTS are null");
else writeln("not null : "~ typeid(s).name);
if (st is null) writeln("statement is null");
else writeln("not null : " ~ typeid(st).name);
s.add(st);
//writeln("Out of here");
}
}
一些注释:
Statements_add
对象和子类Statements
对象调用Statement
函数。现在,它的奇怪之处:</ strong>
s.add(st);
语句似乎是罪魁祸首。s
,st
)null
。if... writeln... typeid
个语句,则会出现错误。发生了什么?
更多细节:
答案 0 :(得分:7)
如果要将D代码中分配的对象的唯一引用从D堆传递给非D代码,那么必须 register it as a GC root,或者更改代码才能使用malloc
而不是从托管D堆分配。否则,GC会认为该对象未使用,并将其收集到空闲内存中。