这段Vala代码是否存在内存泄漏问题?

3
根据这里的内容:

Vala没有垃圾回收机制。它使用引用计数。

我不确定垃圾回收和引用计数之间的区别,也找不到一个清晰的解释。我需要显式地删除bmp和/或向类Bmp添加析构函数吗?换句话说:这段代码是否有内存泄漏?
public void* run() {
    while(true) {
        if(detected) {
            ...
            var bmp = new Bmp(800,800);
            ...

public class Bmp {
    ...
1个回答

7

您编写的代码不是内存泄漏,但有可能会写出内存泄漏的代码。例如:

   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.

如果您的对象图中没有循环引用,那么就不会有问题。但如果存在任何循环引用,如果没有正确清理,可能会导致内存泄漏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接