Re[3]: Как узнать кто ссылается на объект?
От: S. Россия http://www.el-work.nm.ru
Дата: 08.06.07 04:11
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, <Аноним>, Вы писали:


А>>при необходимости можно вызвать принудительную сборку мусора, вплоть до очистки всех неиспользуемых объектов

R>Не стоит, это очень нехорошо.
R>Для этого нужно использовать слабые ссылки WeakReference.

Чистку мусора я конечно же вызываю и конечно же это ничего не меняет. и WeakReference
я использую ... иначе как понять что объект еще не удален.


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

Кто-нибудь может пояснить чем отличаются различные режимы запуска для сборщика мусора?

И еще есть у меня вот такой пример: (Извеняюсь что много кода)

using System;
using System.Collections.Generic;
using System.Text;

namespace User
{
    public class Test
    {
    }

    public class Stat
    {
        public static Test CreateTest(Test Parent, Type ObjectType)
        {
            return Activator.CreateInstance(ObjectType) as Test;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<Type> lT = new List<Type>();
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));
            lT.Add(typeof(Object));

            // Все работает правильно
            //Test tt = new Test();

            // Работает не правильно
            Test tt = Activator.CreateInstance(typeof(Test)) as Test;

            WeakReference wr = new WeakReference(tt);
            tt = null;
            long pGC1 = GC.GetTotalMemory(false);

            GC.Collect();
            GC.WaitForPendingFinalizers();

            int iiII = -1;
            if (wr.Target != null)
            {
                Console.WriteLine("Error");
                iiII = GC.GetGeneration(wr);
            }
            else
            {
                Console.WriteLine("OK");
            }
            Test n1 = Stat.CreateTest(null, typeof(Test));
            Test n2 = Stat.CreateTest(null, typeof(Test));
            Console.ReadLine();
        }
    }
}


Так вот если я объект создаю через активатор, то работает не правильно, если напрямую через new то правильно.
Такая ситуация наблюдается только при запуске из студии

У меня есть более сложный пример в котором подобная же ситуация наблюдается всегда кроме запуска из релизной сборки.

В общем я не знаю как понимать то, что происходит.

Если кто может прояснить ситуацию, объясните пожалуйста в чем дело.

Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.