2

これによると

Vala にはガベージ コレクションがありません。参照カウントを行います。

ガベージ コレクションと参照カウントの違いが正確にはわかりませんし、明確な説明を見つけることもできませんでした。クラス Bmp に明示的に bmp を削除したり、デストラクタを追加したりする必要がありますか? IOW: このコードにはメモリ リークがありますか?

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

public class Bmp {
    ...
4

1 に答える 1

6

あなたが書いたコードはメモリリークではありませんが、書くことは可能です。例えば:

   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.

オブジェクト グラフに循環がない場合、問題はありません。循環参照がある場合、適切にクリーンアップしないとメモリ リークが発生する可能性があります。

于 2012-10-31T19:37:22.537 に答える