2

据此_

Vala 没有垃圾收集。它进行引用计数。

我不确定垃圾收集和引用计数之间有什么区别,也找不到明确的解释。我是否明确需要删除 bmp 和/或向 Bmp 类添加析构函数?IOW:这段代码有内存泄漏吗?

public void* run() {
    while(true) {
        if(detected) {
            ...
            var bmp = new Bmp(800,800);
            ...

public class Bmp {
    ...
4

1 回答 1

6

您编写的代码不是内存泄漏,但可以编写一个。例如:

   class Foo {
       Foo? f;
   }
   var foo1 = new Foo();
   var foo2 = new Foo();
   foo1.f = foo2;
   foo2.f = foo1;

每次Foo分配 a 时,该实例的计数器在未分配时递增和递减。因为foo1foo2相互引用,所以它们的计数永远不会变为零,即使在程序的其余部分中没有对它们的引用。unowned关键字进行了不计入的引用。所以,悬空指针可以写成如下:

var foo = new Foo();
unowned Foo f = foo;
foo = null;
// f now refers to an object that has been deallocated.

如果您的对象图没有循环,则不会有问题。如果您有任何循环引用,如果您没有正确清理,您可能会泄漏内存。

于 2012-10-31T19:37:22.537 回答