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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2017, 12:01   #1
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию Queue<T> и массивы

Имеется следующий фрагмент кода
Код:
    static int[] A = new int[] { 4, 8, 6, 1, 2 };
    static Queue<int[]> Test = new Queue<int[]>();
    public static void Main()
    {
        
        int[] C = new int[5];
        SS(A);
        Array.Clear(A, 0, A.Length);
        Console.Readline(); //Тут точка останова

    static void SS( int[] ars)
    {
        Test.Enqueue(ars);      
    }
Проблема в том, что после вызова Array.Clear, значения массива в очереди тоже очищаются. Я так понимаю, это происходит потому что Queue содержит указатели на на добавляемые объекты, а не сами объекты. Можно ли в условиях такого кода сделать так, чтобы очищался только массив A, не затрагивая значения в очереди?

Последний раз редактировалось Girei; 29.03.2017 в 12:04.
Girei вне форума Ответить с цитированием
Старый 29.03.2017, 12:11   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А зачем такой фигней заниматься?)

Ну копию массива создать если надо.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.03.2017, 12:23   #3
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А зачем такой фигней заниматься?)

Ну копию массива создать если надо.
Дело в том, что в основном коде записей в очередь очень много (счёт на миллиарды). Допустим, в методе SS, я для каждой записи выделяю память под новый массив. Как мне гарантировать, что после выхода из метода, память будет освобождена?
Girei вне форума Ответить с цитированием
Старый 29.03.2017, 12:26   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Выхода из какого метода?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.03.2017, 12:30   #5
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Выхода из какого метода?
В данном случае, из SS.
Girei вне форума Ответить с цитированием
Старый 29.03.2017, 12:36   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

эм... гарантирую, что она не будет освобождена )
С чего вдруг массиву там уничтожаться? Вы ж для того и хотите создать копию. Как вы будете использовать уничтоженный массив?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.03.2017, 12:47   #7
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
эм... гарантирую, что она не будет освобождена )
С чего вдруг массиву там уничтожаться? Вы ж для того и хотите создать копию. Как вы будете использовать уничтоженный массив?
Суть вот в чём. Я передаю в метод смещение, начиная с которого он читает кусок файла и записывает в очередь маленькими порциями. Другой метод работает с данными в этой очереди. Как мне гарантировать, что память будет освобождена после того, как все данные в очереди обработаны?
Girei вне форума Ответить с цитированием
Старый 29.03.2017, 14:33   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы языком не ошиблись?
ссылку не держите, и память будет освобождена.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.03.2017, 14:59   #9
Girei
Пользователь
 
Аватар для Girei
 
Регистрация: 22.10.2013
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вы языком не ошиблись?
ссылку не держите, и память будет освобождена.
Она точно будет освобождена без моего вмешательства? Для меня была очень неприятным сюрпризом особенность очереди, описанная выше. Вот, я уже ни в чем не уверен.
Girei вне форума Ответить с цитированием
Старый 29.03.2017, 19:42   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Да, если не останется ссылок нигде.

В чем особенность? Массивы почти во всех языках не по значению передаются. Даже в С++ только если контейнер типа vector.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++ queue Catfish Общие вопросы C/C++ 1 01.12.2010 17:28
с++ queue Catfish Общие вопросы C/C++ 1 29.11.2010 22:14
класс queue Александра1000000 Помощь студентам 6 27.05.2010 23:10
class queue Freer Общие вопросы C/C++ 6 16.01.2009 00:05