2012-10-31 28 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. 

如果你的對象圖沒有循環,就沒有問題。如果您有任何循環引用,如果您沒有正確清理,可能會泄漏內存。