我遇到了内存泄漏的问题,因此我做了以下测试代码。
#!/usr/bin/cjs
"use strict";
import Gtk from 'gi://Gtk?version=3.0';
Gtk.init (null);
const window= new Gtk.Window ();
let buttons=[], button, box=new Gtk.Box ({ orientation:1}), remove=true;
function construct_buttons ()
{
for (let i=0;i<500;i++)
{
button=new Gtk.Button ({label:"hello"});
box.add (button);
buttons.push (button);
}
}
setInterval (function ()
{
if (remove)
{
for (let i=0;i<500;i++) buttons[i].destroy ();
buttons=[], button=null;
}
else
{
construct_buttons ();
window.show_all ();
}
remove=!remove;
}, 2000);
construct_buttons ();
window.add(box);
window.set_title ("Test");
window.connect ('destroy', () => { Gtk.main_quit (); });
window.set_size_request (740, 600);
window.show_all ();
Gtk.main ();
我构造了 500 个按钮并将其添加到一个框中。2 秒后,我使用 Gtk.widget.destroy() 销毁它们并释放引用数组 buttons=[], button=null,2 秒后我再次构造它们,依此类推。
这样做了一段时间后,我的内存从 17MiB 增长到了 50MiB。然后我停止了。我不知道我做错了什么。我在更大的应用程序中也遇到了同样的问题。这只是一个用于测试的小例子。
我也尝试过用 Gtk.widget.remove(widget) 来代替 destroy,然后让 cjs 销毁它,但这里内存也会增大。
我有 cjs 版本 6.0.0