LoginSignup
3

More than 5 years have passed since last update.

ローカルスコープの変数がスコープを抜ける前にガベージコレクションされる

Last updated at Posted at 2013-11-01

次のコードは所謂多重起動の防止のためにミューテックスを使う例ですが、リリースビルドだと意図通りに動かないことがあります。

using System;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            bool ok;
            Mutex mutex = new Mutex(true, "OreOre", out ok);

            if (ok)
            {
                Console.WriteLine("process ok");
            }
            else
            {
                Console.WriteLine("process duplicate");
            }

            GC.Collect();

            Console.ReadKey();
        }
    }
}

GC.Collect がミューテックスを解放してしまうからですが、mutex 変数が Main のスコープにあるので Main を抜けるまでは GC されないように思いますが・・・


もっと判りやすいのが↓これ。hoge のファイナライザがスコープを抜ける前に呼ばれます。

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var hoge = new Hoge();
            GC.Collect();
            Console.ReadKey();
        }
    }

    class Hoge
    {
        ~Hoge()
        {
            Console.WriteLine("Hoge Finalize");
        }
    }
}

最適化によって次のように書き換えられるためだと思われます。

-var hoge = new Hoge();
+new Hoge();

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3