d从创建新对象的接口调用函数时垃集错误
//示例代码:
interface IFont
{
IFont createFontWithSize(int size);
}
//主代码
import common;
class TTFFont : IFont
{
IFont createFontWithSize(int size){return new TTFFont;}
}
export extern(System) IFont newFont()
{
auto ret = new TTFFont();
GC.addRoot(ret);
return ret;
}
//DLL代码:
import common;
Runtime.initialize();
IFont function() newFont;
newFont = loadSymbol("newFont");
IFont myFont = newFont();
IFont otherFont = myFont.createFontWithSize(32);
//一段时间后`垃集`
因为过了一段时间,还未收集它,我实际上需要把GC.addRoot
放在createFontWithSize
函数中.从而使它无法
使用.
D的DLL
都在独立于主进程
的GC
上下文中运行,因此如果不再维护对DLL
中新建对象
引用,则可收集它.可以把它们链接在一起,这样就可共享相同的GC
,如下所示:
// mydll.d
extern(C) {
void gc_setProxy(void* p);
void gc_clrProxy();
}
export void MyDLL_Initialize(void* gc) {
gc_setProxy(gc);
}
export void MyDLL_Terminate() {
gc_clrProxy();
}
// main.d
extern (C) {
void* gc_getProxy();
}
void main() {
MyDLL_Initialize(gc_getProxy());
//用DLL共享本进程的GC
scope(exit) MyDLL_Terminate();
/*干活...*/
}
这只适用于dmd窗口
(使用ldc
,对所有混合的,可得到共享的druntime
),不必自己
设置代理,Runtime.loadLibrary
会为你做.
但一定
要确保使用的是Runtime.loadLibrary
!我不认为不能单独使用SimpleDllMain
,所以这可能是奇怪
的问题.
这是另一个必须记住
的令人困惑的差异
.维基有已知编译器差异
的最新列表
吗?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现