根据this
Vala没有垃圾收集。它确实引用了计数。
我不确定垃圾收集和引用计数之间的区别是什么,我也找不到明确的解释。 我是否明确需要删除bmp和/或向Bmp类添加析构函数? IOW:这段代码是否有内存泄漏?
public void* run() {
while(true) {
if(detected) {
...
var bmp = new Bmp(800,800);
...
public class Bmp {
...
答案 0 :(得分:6)
您编写的代码不是内存泄漏,但可以编写代码。例如:
class Foo {
Foo? f;
}
var foo1 = new Foo();
var foo2 = new Foo();
foo1.f = foo2;
foo2.f = foo1;
每次分配Foo
时,该实例的计数器会在未分配时递增和递减。因为foo1
和foo2
相互引用,所以即使在程序的其余部分中没有对它们的引用,它们的计数也永远不会为零。 unowned
关键字会生成未计入的引用。因此,悬挂指针可以写成如下:
var foo = new Foo();
unowned Foo f = foo;
foo = null;
// f now refers to an object that has been deallocated.
如果对象图没有周期,则没有问题。如果您有任何循环引用,如果您没有正确清理,可能会泄漏内存。