2012-10-31 20 views
2

根据this这个vala代码是内存泄漏吗?

Vala没有垃圾回收。它确实引用了计数。

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

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

public class Bmp { 
    ... 

回答

6

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

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

每一个Foo分配时间,该实例计数器递增,当它是未分配递减。由于foo1foo2具有彼此的引用,因此即使在程序的其余部分中没有引用它们,它们的计数也不会变为零。 unowned关键字会使参考不被计数。所以,一个悬挂指针可以写成如下:

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

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