Что именно является контрактом GCHandle.Alloc (Object)? - PullRequest
4 голосов
/ 07 октября 2011

Я хотел бы иметь строгое понимание контракта GCHandle.Alloc (Object).

Из документации я понимаю, что если я позвоню:

GCHandle gc = GCHandle.Alloc(foo);

foo гарантированно не будет собирать мусор, пока я не позвоню:

gc.Free();

Я также понимаю, что foo будет собираться, если AppDomain выгружен.

Что я хотел бы проверить, так это то, что вызов Alloc без вызова Free фактически совпадает (в глазах GC) с корневой ссылкой.

Чтобы было ясно, если это так, тогда область действия переменной GCHandle gc не влияет на время жизни foo. Если Free не вызывается, foo живет до тех пор, пока домен приложения не будет выгружен.

например. Объект вызывает Alloc для себя и не сохраняет экземпляр GCHandle, он будет жить до тех пор, пока не будет выгружен домен приложений.

Это правильно?

Некоторые ссылки:

http://msdn.microsoft.com/en-us/library/a95009h1.aspx

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.free.aspx

http://blogs.msdn.com/b/clyon/archive/2005/03/18/398795.aspx

1 Ответ

1 голос
/ 07 октября 2011

Правильно.Переменная GCHandle не влияет на время жизни объекта, который вы передаете в GCHandle.Alloc ().Я проверил это с помощью следующих двух классов:

class Test
{
   public Test ()
   {
      System.Runtime.InteropServices.GCHandle.Alloc(this);
   }
   ~Test ()
   {
   }
}
class Server : MarshalByRefObject
{
   public Server ()
   {
      new Test();
   }
   public void Collect ()
   {
      GC.Collect();
      GC.WaitForPendingFinalizers();
   }
}

и следующего кода теста:

AppDomain ad = AppDomain.CreateDomain("test");
Server svr = (Server)ad.CreateInstanceAndUnwrap(
   System.Reflection.Assembly.GetExecutingAssembly().FullName, 
   typeof(Server).FullName);
for (Int32 i = 0; i < 100; i++)
   svr.Collect();

Используя этот пример, если вы установите точку останова в финализаторе класса Test, выобратите внимание, что он не вызывается во время каких-либо вызовов GC.Collect / WaitForPendingFinalizers.Тем не менее, точка останова достигается, когда домен приложения выгружается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...