【问题标题】:Is this vala code a memory leak?这个vala代码是内存泄漏吗?
【发布时间】:2012-10-31 15:19:16
【问题描述】:

根据this

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

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

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

public class Bmp {
    ...

【问题讨论】:

    标签: memory-leaks vala


    【解决方案1】:

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

       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.
    

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

    【讨论】:

      猜你喜欢
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2011-02-20
      • 2013-08-12
      相关资源
      最近更新 更多