Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Как удалить массив


Автор: agealex 8.10.2007, 10:04
Есть массив переменной длины в зависимости от содержимого вызываемой функции, по этому приходится создавать его постоянно с параметром new, как его удалить ? в С++ был delete [] ... ;  а есть ли аналог в шарпе?
Код

while (!StopRecv)
            {
                int QBufSize = 1024 *EnlargeBuffer;
                byte[] buffer = new byte[QBufSize] ;
...

 smile 

Автор: ivashkanet 8.10.2007, 10:10
agealex, 

1) это не твои вопросы. Все сделает сборщик мусора (если все же считаешь их своими, то можно вызвать его принудительно: GC.Collect(); (вроде так))
2) Возможно тебе подойдет саморастущая коллекция (почти массив): List<T>

Автор: agealex 8.10.2007, 10:15
 Запустить нужно один раз или тоже в цикле?

Автор: ivashkanet 8.10.2007, 10:33
agealex, в момент вызова GC.Collect(); сборщик мусора приступает к работе. Так что тебе нужно в цикле. Но ты учти, что будут собраны все "неживые" объекты, а не только твой массив. Так что первый запуск может "подтормаживать".

А вообще не заморачивайся. Я "кидаю" мегабайтные объекты и ничего. А ты на килобайтные смотришь...

P.S. Если распишешь задачу подробнее может найдём другое решение...
 

Автор: zaver 8.10.2007, 10:51
да кстати GC заметно хавает ресурсы во время работы. ИМХО тебе не стоит его вызывать, он сам все делает за тебя, если утечки памяти и бывают то уж не его вине. я уже давно не забочусь о памяти, т.к. запустив диспетчера задач, сразу вижу что GC не дает памяти подыматься более чем на ~30% от первоночальной. редко бывают случаи когда есть утечки памяти, но это уже не по его вине.

Автор: agealex 8.10.2007, 12:25
Ну в моем случае количество памяти очень важно, прога на кпк должна работать а там места мало, програмка усиленно засерает память, пытаюсь найти в каком месте , вот думаю может в этом

Автор: zaver 8.10.2007, 13:01
зачастую память засирается (т.е. так что GC никак не помогает) в том случае, если ты посотянно создаешь новые объекты, так что ссылки на старые не теряются, например сохраняются в списке или массиве и причом это может быть неявно. например, в XNA часто встречал такое, что создаются объекты каждый раз при прорисовке, я думал, что они удаляются (у меня в коде нигде не было "живих" указателей), а на самом деле какой-то библиотечный объект их просто "складировал" в свой список и  молчал  smile 

Автор: ivashkanet 8.10.2007, 13:40
Цитата(agealex @  8.10.2007,  12:25 Найти цитируемый пост)
прога на кпк должна работать

Да, тут это важнее...
Цитата(agealex @  8.10.2007,  12:25 Найти цитируемый пост)
пытаюсь найти в каком месте

Может профайлер?
Вот тут их куча: http://sharptoolbox.com/categories/profilers-debuggers
Но большинство платные.
Лично я пользовался ANTS (триал на 14 дней) -- очень понравился.

Автор: agealex 8.10.2007, 14:38
Все. Спасибо нашел, оказывается зря на шрап грешил, нашел ошибку в коде.

Автор: VisualProgrammerNET 11.10.2007, 00:40
Что мешало объявить массив нулевым до цикла и потом использовать его одного всегда?

Автор: ivashkanet 11.10.2007, 09:53
VisualProgrammerNET, а смысл?
Цитата(VisualProgrammerNET @  11.10.2007,  00:40 Найти цитируемый пост)
объявить массив нулевым до цикла

Оптимизатор компиляции все равно вынесет объявление переменной за пределы цикла. (А даже если не вынесет, то этот вызов ничего не стоит для системы).
Цитата(VisualProgrammerNET @  11.10.2007,  00:40 Найти цитируемый пост)
потом использовать его одного всегда

Не стоит путать "указатель" на массив и сам массив, физически расположенный в памяти (кот всегда разный).

Автор: lankin 7.11.2007, 09:07
Цитата(zaver @  8.10.2007,  13:01 Найти цитируемый пост)
зачастую память засирается (т.е. так что GC никак не помогает) в том случае, если ты посотянно создаешь новые объекты, так что ссылки на старые не теряются, например сохраняются в списке или массиве и причом это может быть неявно. например, в XNA часто встречал такое, что создаются объекты каждый раз при прорисовке, я думал, что они удаляются (у меня в коде нигде не было "живих" указателей), а на самом деле какой-то библиотечный объект их просто "складировал" в свой список и  молчал 

И вот как от этого избавиться????
И, спрашивается, нафига это складирование придумано?

Автор: 1stain 7.11.2007, 12:47
а что тебе мешает создавать массив байт в стеке - и быстродействие будет повыше и сборщег мусора ни причем...
Цитата( Рихтер"CLR via C#")

Когда вопрос производительности стоит особенно остро, можно размещать управляемый объект-массив не в куче, а в стеке потока, используя оператор stackalloc языка С#...

Автор: lankin 8.11.2007, 05:27
Цитата(1stain @ 7.11.2007,  12:47)
а что тебе мешает создавать массив байт в стеке - и быстродействие будет повыше и сборщег мусора ни причем...
Цитата( Рихтер"CLR via C#")

Когда вопрос производительности стоит особенно остро, можно размещать управляемый объект-массив не в куче, а в стеке потока, используя оператор stackalloc языка С#...

А можно подробнее об этом?

Автор: 1stain 8.11.2007, 14:15
поподробней  - купи книгу и прочитай. ЭТА книга своих денег стоит на 200%

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)