Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2011, 02:24   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Вопрос Освобождение памяти от экземпляра класса

Реализовываю задачу по дисциплине "Структуры и алгоритмы". Как понимаете, данная дисциплина накладывает жесткие ограничения на работу с памятью - ни один бит не должен уйти в пустую, скорость выполнения алгоритма должна быть высокой и т.д.
Стояла задача реализовать свой собственный двусвязный список(LinkedList использовать нельзя), в котором необходимы методы: Push() - вставить экземпляр в список; Pop() - изъять(перенаправить связи) экземпляра списка; Get_First() - получить первый экземпляр в списке; само собой конструкторы и деструктор и прочее. Все это успешно реализовано, но встал вопрос про экономию памяти: если текущий размер списка больше чем тот, который ввел пользователь, то нужно удалить несколько последних элементов. Не долго думая, пишу банальный код:
Код:
delete MyElement.Get_Last().Pop()
Но вся проблема заключается в том, что метод delete почему-то недоступен(находится за пределами области видимости компилятора VS2010). Подскажите, какой модуль нужно подключить, чтобы данный код нормально работал, чтобы была возможность вызывать метод delete?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 03.01.2011, 03:03   #2
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

Разделом не ошиблись?

В .net нету delete, нельзя ничего удалить - все лишнее автоматически освобождается
m0nax вне форума Ответить с цитированием
Старый 03.01.2011, 03:42   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

какой нахрен delete в dotNET?
там обьекты сами уничтожаются как только теряются все ссылки на них.

(да я и вообще считаю что dotNET и экономия памяти вещи не совместимые, VM всетаки)

или я отстал от жизни?(это вопрос к шарпистам)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.01.2011, 12:55   #4
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Единственный ход быстрой очистки памяти в .NET, насколько я знаю, это - убить объект(= null и вручную вызвать сборщик мусора.
Hollander вне форума Ответить с цитированием
Старый 04.01.2011, 14:44   #5
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Вот почитай...
dampirik вне форума Ответить с цитированием
Старый 05.01.2011, 12:45   #6
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Смущение

Цитата:
Сообщение от Hollander Посмотреть сообщение
вручную вызвать сборщик мусора.
Цитата:
Сообщение от dampirik Посмотреть сообщение
Спасибо за советы вручную вызвать сборщик мусора, работая на "не автоматизированном" языке C++ - совсем о нем забыл.
По предоставленным ссылкам MSDN, нашел методику вызова сборщика мусора:
Код:
 GC.Collect(n);//первая перегрузка
или
Код:
GC.Collect();//вторая перегрузка
, только немного не ясно, что означает аргумент функции Collect в первой перегрузке - он освобождает потомков до поколения n, а вторая перегрузка освобождает всю занятую но неиспользуемую память? Если это так, то зачем нужна первая перегрузка, ведь "если на объект потеряны все ссылки", то с ним больше ни как не поработаешь или я немного не понимаю принципы C#?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 05.01.2011, 13:21   #7
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
По умолчанию

У object есть метод Dispose(), который его уничтожает и очищает память.
Никки вне форума Ответить с цитированием
Старый 05.01.2011, 16:40   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от Mixim Посмотреть сообщение
или я немного не понимаю принципы C#?
На самом деле там всё просто, ггг.

Цитата:
Basically, the GC divides the managed heap into three generations. Objects that have just been allocated are in Gen0 and objects that have survived one collection cycle are in Gen1; all other objects are in Gen2.

The CLR keeps the Gen0 section relatively small (a maximum of 16 MB on the 32-bit workstation CLR, with a typical size of a few hundred KB to a few MB). When the Gen0 section fills up, the GC instigates a Gen0 collection—which happens relatively often. The GC applies a similar memory threshold to Gen1 (which acts as a buffer to Gen2), and so Gen1 collections are relatively quick and frequent too. Full collections that include Gen2, however, take much longer and so happen infrequently.



Figure 12-2 shows the effect of a full collection.

To give some very rough ballpark figures, a Gen0 collection might take less than 1 ms, which is not enough to be noticed in a typical application. A full collection, however, might take as long as 100 ms on a program with large object graphs. These figures depend on numerous factors and so may vary considerably—particularly in the case of Gen2 whose size is unbounded (unlike Gen0 and Gen1).
Есть такая пословица, "не мала баба хлопоту, купила порося". Вызывать GC.Collect(), пытаясь сэкономить ничтожные биты памяти, это примерно как вызывать дефрагментацию диска после каждой записи в файл.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.01.2011, 17:27   #9
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Вызывать GC.Collect(), пытаясь сэкономить ничтожные биты памяти, это примерно как вызывать дефрагментацию диска после каждой записи в файл.
Отчасти согласен. Для Mixim - это действительно так. Но когда объекты занимают сотни mb (у меня такие на практике есть), то такой вызов единственное спасение.
Hollander вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление экземпляра класса Juffin Общие вопросы Delphi 5 02.11.2010 11:57
Освобождение памяти Seran4ek Общие вопросы Delphi 7 21.12.2009 18:07
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23
Освобождение Памяти в Си volotsky Помощь студентам 2 16.12.2008 22:36