ref C# 7
От: #John Европа https://github.com/ichensky
Дата: 30.11.18 11:26
Оценка:
Здравствуйте,

Как работает ref в C# 7?
В функции `func` мы создаем массив, и возвращаем указатель на один из его эллементов. По идее GC должен при создании массива, под объект `arr` выделить в куче память, а после того как все ссылки будут потеряны на `arr` GC должен уничтожить этот объект. Но из функции мы возвращаем указатель не на сам объект `arr` , а на один из его эллементов.
Как GC понимает, что `arr` еще нельзя уничтожать, потому что один из его эллементов все еще используется?
Получется если GC не уничтожает `arr`, а в вызывающей функции виден только один эллемент из массива, значит произошла утечка памяти, до тех пор пока не уничтожится указатель на эллемент массива?
И что во время маркировки объектов на уничтожение GC приходится дополнительно сканировать память объекта для того что бы знать, есть ли ссылка на один из его эллементов?

public class Gg {
        public ref int func() {
            var arr = new int[6];
            arr[3] = 54;
            return ref arr[3];
        }
    }
class Program
    {
        static void Main(string[] args)
        { 
            var g =new Gg();
            ref int x = ref g.func();
            g = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();

            Console.WriteLine($"{x}"); // 54
        }
    }
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: ref C# 7
От: romangr Россия  
Дата: 30.11.18 11:38
Оценка: 75 (2) +1
Здравствуйте, #John, Вы писали:

J>Здравствуйте,


J>Как работает ref в C# 7?

J>В функции `func` мы создаем массив, и возвращаем указатель на один из его эллементов. По идее GC должен при создании массива, под объект `arr` выделить в куче память, а после того как все ссылки будут потеряны на `arr` GC должен уничтожить этот объект. Но из функции мы возвращаем указатель не на сам объект `arr` , а на один из его эллементов.
J>Как GC понимает, что `arr` еще нельзя уничтожать, потому что один из его эллементов все еще используется?
J>Получется если GC не уничтожает `arr`, а в вызывающей функции виден только один эллемент из массива, значит произошла утечка памяти, до тех пор пока не уничтожится указатель на эллемент массива?
J>И что во время маркировки объектов на уничтожение GC приходится дополнительно сканировать память объекта для того что бы знать, есть ли ссылка на один из его эллементов?

During GC, interior pointers are translated into corresponding objects thanks to the so-called brick table and plug trees.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.