Работа с памятью
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Работа с памятью Expand / Collapse
Автор
Сообщение
11.03.2006 15:16
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 25.04.2006 16:37
Сообщ.: 6, Visits: 67
Всем добрый день.

У меня появился такой вопрос:

Предположим, есть такой код:

AnotherObj GetAO()
{
SomethingObj A = new Something("wow");
AnotherObj B = A.SomePropery;
return B;
}


Т.е. объект B - это фактически ссылка на какое-то поле объекта A. При выходе, функция возвращает объект B. Но фактически возвращает ссылку на некоторое поле объекта A. Получается, что после выхода за область видимости функции, объект A не может быть уничтожен, т.к. на него есть ссылка. Таким образом, если объект A занимает много памяти, мы просто теряем эту память, так как нам не нужен весь объект, а нужно лишь одно его поле.

Это дейчтвительно так, или в строке
AnotherObj B = A.SomePropery;

будет создана копия объекта A.SomePropery и объекту B уже будет присвоена ссылка на этот созданный объект???
Сообщ. #892511
13.03.2006 13:48
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
[quote="GOster"]Т.е. объект B - это фактически ссылка на какое-то поле объекта A.[/quote]
Нет! Переменная B хранит адрес объекта класса AnotherObj в управляемой куче.

[quote="GOster"]Но фактически возвращает ссылку на некоторое поле объекта A.[/quote]
Опять же - нет. Возвращается указатель. Таким образом объект A и переменная B хранят указатель на один и тот же участок в куче.

[quote="GOster"]Получается, что после выхода за область видимости функции, объект A не может быть уничтожен, т.к. на него есть ссылка. Таким образом, если объект A занимает много памяти, мы просто теряем эту память, так как нам не нужен весь объект, а нужно лишь одно его поле.[/quote]
Яркий пример неправильного вывода при исхождении из неправильной посылки. Объекты A и B в общем случае никак не связаны. То есть если объект B не удерживает ссылку на родительский объект А, то A может быть спокойно уничтожен, а B будет продолжать жить. Вот пример такой ситуации (в присоединенном файле можно посмотреть результат выполнения этой консольной программы):

using System;


public class AnotherObj
{
public AnotherObj()
{
}

~AnotherObj()
{
Console.WriteLine("CLR is executing AnotherObj finalizer.");
}
}


public class SomethingObj
{
private string _s;
private AnotherObj _somePropery;

public AnotherObj SomePropery
{
get { return _somePropery; }
}

public SomethingObj(string s)
{
_s = s;
_somePropery = new AnotherObj();
}

~SomethingObj()
{
Console.WriteLine("CLR is executing SomethingObj finalizer.");
}
}


public class ConsoleApp
{
private static AnotherObj GetAO()
{
Console.WriteLine("GetAO() begin");
SomethingObj A = new SomethingObj("wow");
AnotherObj B = A.SomePropery;
Console.WriteLine("GetAO() end");
return B;
}

public static void Main()
{
AnotherObj b = GetAO();

Console.WriteLine("Press to start GC");
Console.ReadLine();
GC.Collect();

Console.WriteLine("Press to start GC #2");
Console.ReadLine();
Console.WriteLine(b.ToString());
GC.Collect();

Console.WriteLine("Press to quit");
Console.ReadLine();

}
}


По результатам выполнения ясно видно что завершитель (finalizer) для класса SomethingObj выполняется раньше завершителя класса AnotherObj, что говорит само за себя.

[quote="GOster"]Это дейчтвительно так, или в строке
AnotherObj B = A.SomePropery;
будет создана копия объекта A.SomePropery и объекту B уже будет присвоена ссылка на этот созданный объект???[/quote]
Ни то, ни другое, если только свойство SomePropery не написано таким образом чтобы всегда возвращать копию объекта AnotherObj.
Сообщ. #892577
17.03.2006 22:06
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 19.08.2008 17:28
Сообщ.: 49, Visits: 512
Молодец bazile хорошо изложил!!!

З.Ы. Все бы так отвечали
Сообщ. #893154
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 2:55