Memory leaks 这个vala代码是内存泄漏吗?

Memory leaks 这个vala代码是内存泄漏吗?,memory-leaks,vala,Memory Leaks,Vala,据 Vala没有垃圾收集功能。它进行引用计数 我不太清楚垃圾收集和引用计数之间的区别,也找不到明确的解释。 我是否明确需要删除bmp和/或向类bmp添加析构函数? 这个代码有内存泄漏吗 public void* run() { while(true) { if(detected) { ... var bmp = new Bmp(800,800); ... public class Bmp {

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

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

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

public class Bmp {
    ...

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

   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.
如果对象图没有循环,就不会有问题。如果有任何循环引用,如果没有正确清理,可能会泄漏内存