ひとモノBLOG

09 « 2017 / 10 » 11
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
profile
SHOO
  • SHOO
  • 機械系の学生。の割にプログラミングとかのほうが得意だったり。
  • RSS
links
BLOG内検索
Adds by DTI Blog

Dのscope変数を拡張してほしい
2008/04/08(火) [04:33:57]

D言語のscope属性の拡張について公式の掲示板で議論されていた。
Extending "scope"(scopeを拡張しようぜ)
詳細は以下から。

Dのキーワードの、scope属性についてですが、この機能としては、インスタンスの寿命を管理し、自動的にリソースを解放する場合などに利用されたりします。
具体的には次のような例ですね。
import std.stdio;

class Foo
{
    this()
    {
        writefln("Foo._ctor");
    }
    
    ~this()
    {
        writefln("Foo._dtor");
    }
}

void main()
{
    writefln("START");
    {
        scope foo = new Foo;
    }
    writefln("END");
}
上記コードの実行結果は以下の通り。
START
Foo._ctor
Foo._dtor
END

しかしながら、今のところ次のような場合を考えると… import std.stdio;

class Foo
{
    this()
    {
        writefln("Foo._ctor");
    }
    
    ~this()
    {
        writefln("Foo._dtor");
    }
}

class Bar
{
    Foo foo;
    this()
    {
        writefln("Bar._ctor");
        foo = new Foo;
    }
    
    ~this()
    {
        writefln("Bar._dtor");
        // ここで foo を delete するのは不正。
        // ガベージコレクタによって既に解放されている可能性があるため。
        //delete foo;
    }
}

void main()
{
    writefln("START");
    {
        scope bar = new Bar;
    }
    writefln("END");
}
次のような結果になるわけですが… START
Bar._ctor
Foo._ctor
Bar._dtor
END
Foo._dtor
この結果の、 END と Foo._dtor を入れ替えて、 START
Bar._ctor
Foo._ctor
Bar._dtor
Foo._dtor
END
このようになってほしい場合を考えたとき、 Bar のデストラクタでコメントアウトしたように、 foo を delete したくなる。でもできない。理由はコメントの通りガベージコレクタが働いてしまった場合は2回リソースを解放することになってしまう危険があるから。
「なんとかしてこれがOKになるようにならんか…」
と考える人はやはりいるようで、以下のような提案がDの公式の掲示板で見られました。
Extending "scope"(scopeを拡張しようぜ)
レスでは「その提案はお前で318番目だよ」とか言われてますが。ウォルターはやるとか言ってたような気も、みたいなこと言ってますがどうなんでしょうね?

個人的には、この scope の拡張もそうなのだけど、さらに、
import std.stdio;
class Foo
{
    ubyte[100] a;
    ubyte[100] b;
}

class Bar
{
    scope Foo foo;
    ubyte[100] c;
    this()
    {
        foo = new Foo;
    }
}

int main()
{
    writefln(Hoge.classinfo.init.length);
    writefln(Fuga.classinfo.init.length);
    scope bar = new Bar;
    return 0;
}
こういう場合にメモリが全部スタックから割り振られるのかも気になるところ。


rel="prev"<<ポーランドの大学でTangoを使ったD言語講座が開講 | ホーム |

この記事に対するトラックバック

この記事のトラックバックURL

この記事に対するコメント

この記事にコメントする

管理者にだけ表示を許可する
| HOME |