|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
код: решение задачи Иосифа Флавия (Josephus Problem) что код делает: 1) создает круговой связанный список 2) удаляет каждый k-тый элемент из списка до тех пор, пока в списке не останется ровно m элементов, которые объявляются победителями Вопросы: 1) в решении использовались глобальные переменные struct node *start, *ptr, *new_node; почему не локальные? если эти переменные объявить в теле функции main(), что это изменит? 2) из списка удалялись элементы, но память выделенная под эти элементы не освобождалась. а почему? в каких случаях память должна освобождаться, а в каких нет? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 17:44 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
mini.weblab 2) из списка удалялись элементы, но память выделенная под эти элементы не освобождалась. а почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 17:52 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, об этом как раз и вопрос: как определить, нужно освобождать или нет? и почему ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 18:00 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
При завершении процесса вся занимаемая им память освобождается операционной системой автоматически. Как и большинство других ресурсов этой самой операционной системы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 18:06 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, тогда, если все делать правильно, то нужно освобождать память ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 18:15 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
Теоретически - да, но операционка сделает это быстрее, не отвлекаясь на деструкторы каждого мелкого объекта. Если у тебя выделены несколько миллионов кусков памяти по 20 байт, то лучше дать им умереть всем сразу, чем ждать пару минут. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 18:19 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
mini.weblab 1) в решении использовались глобальные переменные struct node *start, *ptr, *new_node; почему не локальные? если эти переменные объявить в теле функции main(), что это изменит? mini.weblab 2) из списка удалялись элементы, но память выделенная под эти элементы не освобождалась. а почему? в каких случаях память должна освобождаться, а в каких нет? Память должна всегда освобождаться. Да, память по окончанию программы будет освобождена самой ОС, но это не значит что во время работы можно нахапать себе кусков памяти и забыть указатели на нее. В общем, в этом месте однозначная ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 18:23 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Теоретически - да, но операционка сделает это быстрее, не отвлекаясь на деструкторы каждого мелкого объекта. Если у тебя выделены несколько миллионов кусков памяти по 20 байт, то лучше дать им умереть всем сразу, чем ждать пару минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 18:25 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
White Owl, > Память должна всегда освобождаться. Осталось решить кем, когда и сколько)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 18:50 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
White Owl тогда для остальных запущенных программ не останется свободной памяти и ОС начнет свапить Если не высвопились на этапе выделения мелких объектов, то переложить освобождение памяти на ОС - вполне нормально. Не сказать, чтобы "правильно", но - "нормально". ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 19:05 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
White Owl, Скорее bad_alloc выбросится при превышении для x86. Но для х64 действительно начнётся падение производительности и «ой» ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 20:29 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
L.Otujktd White Owl, Скорее bad_alloc выбросится при превышении для x86. Но для х64 действительно начнётся падение производительности и «ой» х64 тоже вылетит не дожидаясь использования всего адресного пространства. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 21:07 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
L.Otujktdbad_alloc выбросится Давно malloc стал его выбрасывать?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 21:12 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Я не увидел что тут чистый си без плюсов, пардон :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 22:36 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
Dima T, Согласен, ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 22:38 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
Если не освобождать память то в логах какого-нибудь контроллера за утечками куча мусора. Перфекционист готов выбросить компьютер за окно. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 22:42 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
теперь изменим условие, и рассмотрим функцию, создающую связанный список допустим, где-то в средине списка, память не выделилась и создание списка прервалось и для корректного выхода нужно делать очищение памяти? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 23:45 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
Профи, зайдя в топик тут-же закинули тему мемори-менеджмента. Тема сложная. Интересная. И выходящая далеко за рамки игрушечной задачи автора. Давайте кратко подытожим. Тезисно. 1) ос эффективнее уберет мусор по завершении процесса. Особенно, если было много мелких аллокаций. 2) существуют задачи в которых отложенная уборка мусора - эффективнее немедленной. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 23:55 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
дополню: автор не очень хорошо разбирается в теме, и склонен к консервативным решениям ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 00:19 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
Положи все node-s в массив. В конце работы алгоритма - удалишь весь массив. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 00:23 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
mayton, это уже будет совсем другое решение: либо используем массив, либо список ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 14:18 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
mini.weblab mayton, это уже будет совсем другое решение: либо используем массив, либо список Глупышка. Задача Иосифа Флавия может быть решена на массиве таких элементов. Код: plaintext 1. 2. 3. 4.
Во время удаления k-го элемента ты просто переставляешь указатель куда надо. И на этом все. А форсированное освобождения одно элемента node не имеет никакого смысла в рамках решения ДАННОЙ конкретной задачи. Возможно господа в топике имеют другое мнение. Или они перфекционисты? Или они просто любят тратить мегафлопы на безсмысленные соблюдения ритуалов? Ведь в конце концов массив будет удалён целиком. И легко. Результат - один и тот-же. И без "ковровых бомбардировок" memory. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 14:43 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
mayton, и да, и нет (я уже сделала все тоже самое, только со списками) 1) преимущество списка - возможность отжать память по максимуму (с массивом так не получится) 2) преимущество массива - простое управление памятью 3) список и удаление элементов, когда они больше не нужны - большое количество памяти будет резервироваться на короткий промежуток времени ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:05 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
mini.weblab, тебе домашнее задание. Посчитай сколько памяти будет аллоцировано после malloc(sizeof(struct node)) для n элементов. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 15:25 |
|
C теория: освобождение памяти и использование глобальных переменных
|
|||
---|---|---|---|
#18+
mayton, ну, например, на моем компьютере под структуру выделяется 16 байт, хотя размер целого числа составляет 4 байта Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 16:41 |
|
|
start [/forum/topic.php?fid=57&msg=39984424&tid=2017372]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 265ms |
total: | 407ms |
0 / 0 |