Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / C теория: освобождение памяти и использование глобальных переменных / 25 сообщений из 31, страница 1 из 2
27.07.2020, 17:44
    #39984424
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
код: решение задачи Иосифа Флавия (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.
#include <stdio.h>
#include <stdlib.h>

struct node {
	int id;
	struct node * next;
};

struct node *start, *ptr, *new_node;

int main() {
	int n, k, m, i, count;
	printf("Enter the number of players: ");
	scanf("%d", &n);
	printf("Enter number k (every k-th player gets eliminated.): ");
	scanf("%d", &k);
	printf("Enter number how many winning players are we going to have: ");
	scanf("%d", &m);

	start = malloc(sizeof(struct node));
	start->id = 1;
	ptr = start;

	// Creating a circular linked list
	for (i=2; i <= n; i++) {
		new_node = malloc(sizeof(struct node));
		ptr->next = new_node;
		new_node->id = i;
		new_node->next = start;
		ptr = new_node;
	}
        // Elimination
	for (count = n; count > m; count--) {
		for (i=0; i<k-1; i++) {
			ptr=ptr->next;
		}

		ptr->next = ptr->next->next;
	}
	// Printing a winning sequence
	int first = ptr->id;
	printf("Id: %d\n", ptr->id);
	ptr = ptr->next;

	while (ptr->id != first) {
		printf("Id: %d\n", ptr->id);
		ptr = ptr->next;
	}
	return 0;
}
...
Рейтинг: 0 / 0
27.07.2020, 17:52
    #39984428
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
mini.weblab
2) из списка удалялись элементы, но память выделенная под эти элементы не освобождалась.
а почему?
Потому, что пофигу.
...
Рейтинг: 0 / 0
27.07.2020, 18:00
    #39984435
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
Basil A. Sidorov,
об этом как раз и вопрос: как определить, нужно освобождать или нет? и почему
...
Рейтинг: 0 / 0
27.07.2020, 18:06
    #39984438
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
При завершении процесса вся занимаемая им память освобождается операционной системой
автоматически. Как и большинство других ресурсов этой самой операционной системы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.07.2020, 18:15
    #39984439
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
Dimitry Sibiryakov,
тогда, если все делать правильно, то нужно освобождать память
...
Рейтинг: 0 / 0
27.07.2020, 18:19
    #39984441
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
Теоретически - да, но операционка сделает это быстрее, не отвлекаясь на деструкторы
каждого мелкого объекта. Если у тебя выделены несколько миллионов кусков памяти по 20
байт, то лучше дать им умереть всем сразу, чем ждать пару минут.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.07.2020, 18:23
    #39984443
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
mini.weblab

1) в решении использовались глобальные переменные
struct node *start, *ptr, *new_node;
почему не локальные? если эти переменные объявить в теле функции main(), что это изменит?
Абсолютно ничего не изменит. В данном случае видимость переменных не важна.

mini.weblab
2) из списка удалялись элементы, но память выделенная под эти элементы не освобождалась.
а почему? в каких случаях память должна освобождаться, а в каких нет?
Не освобождаются потому что ошибка.
Память должна всегда освобождаться.
Да, память по окончанию программы будет освобождена самой ОС, но это не значит что во время работы можно нахапать себе кусков памяти и забыть указатели на нее.
В общем, в этом месте однозначная ошибка.
...
Рейтинг: 0 / 0
27.07.2020, 18:25
    #39984445
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
Dimitry Sibiryakov

Теоретически - да, но операционка сделает это быстрее, не отвлекаясь на деструкторы
каждого мелкого объекта. Если у тебя выделены несколько миллионов кусков памяти по 20
байт, то лучше дать им умереть всем сразу, чем ждать пару минут.
... то тогда для остальных запущенных программ не останется свободной памяти и ОС начнет свапить. А потом кончится свап и настанет окончательный "Ой".
...
Рейтинг: 0 / 0
27.07.2020, 18:50
    #39984452
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
White Owl,
> Память должна всегда освобождаться.
Осталось решить кем, когда и сколько))))
...
Рейтинг: 0 / 0
27.07.2020, 19:05
    #39984459
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
White Owl
тогда для остальных запущенных программ не останется свободной памяти и ОС начнет свапить
В этой примитивной программе сначала выделяется столько памяти, сколько попрошено и уже потом начинают удалять "счастливчиков".
Если не высвопились на этапе выделения мелких объектов, то переложить освобождение памяти на ОС - вполне нормально. Не сказать, чтобы "правильно", но - "нормально".
...
Рейтинг: 0 / 0
27.07.2020, 20:29
    #39984472
L.Otujktd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
White Owl,

Скорее bad_alloc выбросится при превышении для x86. Но для х64 действительно начнётся падение производительности и «ой»
...
Рейтинг: 0 / 0
27.07.2020, 21:07
    #39984481
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
L.Otujktd
White Owl,

Скорее bad_alloc выбросится при превышении для x86. Но для х64 действительно начнётся падение производительности и «ой»

х64 тоже вылетит не дожидаясь использования всего адресного пространства.
...
Рейтинг: 0 / 0
27.07.2020, 21:12
    #39984483
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
L.Otujktdbad_alloc выбросится

Давно malloc стал его выбрасывать?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.07.2020, 22:36
    #39984506
L.Otujktd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
Dimitry Sibiryakov,

Я не увидел что тут чистый си без плюсов, пардон :)
...
Рейтинг: 0 / 0
27.07.2020, 22:38
    #39984507
L.Otujktd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
Dima T,

Согласен,
...
Рейтинг: 0 / 0
27.07.2020, 22:42
    #39984510
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
Если не освобождать память то в логах какого-нибудь контроллера за утечками куча мусора. Перфекционист готов выбросить компьютер за окно.
...
Рейтинг: 0 / 0
27.07.2020, 23:45
    #39984516
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
теперь изменим условие, и рассмотрим функцию, создающую связанный список
допустим, где-то в средине списка, память не выделилась и создание списка прервалось
и для корректного выхода нужно делать очищение памяти?

Код: 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.
// Create a list
struct node *create_list(unsigned long length) {
	struct node *start;
	struct node *new_node, *ptr;
	start = malloc(sizeof(struct node));
	if (start == NULL) {
		printf("Unable to create requested list. Memory allocation error.\n");
		exit(1);
	}
	start->id = 1;
	start->next = start;
	start->remained_next = start;

	ptr = start;

	for (int i = 2; i <= length; i++) {
		new_node = malloc(sizeof(struct node));
		if (new_node == NULL) {
			printf("Unable to create requested list. Memory allocation error.\n");
                        // MEMORY DEALLOCATION CODE?? DO WE NEED IT OR NOT?
			exit(1);
		}
		ptr->next = new_node;
		ptr->remained_next = new_node;
		new_node->id = i;
		new_node->next = start;
		new_node->remained_next = start;
		ptr = new_node;
	}

	return start;
}
...
Рейтинг: 0 / 0
27.07.2020, 23:55
    #39984518
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
Профи, зайдя в топик тут-же закинули тему мемори-менеджмента.

Тема сложная. Интересная. И выходящая далеко за рамки игрушечной задачи автора.

Давайте кратко подытожим.

Тезисно.

1) ос эффективнее уберет мусор по завершении процесса. Особенно, если было много мелких аллокаций.

2) существуют задачи в которых отложенная уборка мусора - эффективнее немедленной.
...
Рейтинг: 0 / 0
28.07.2020, 00:19
    #39984523
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
дополню:
автор не очень хорошо разбирается в теме, и склонен к консервативным решениям
...
Рейтинг: 0 / 0
28.07.2020, 00:23
    #39984526
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
Положи все node-s в массив.

В конце работы алгоритма - удалишь весь массив.
...
Рейтинг: 0 / 0
28.07.2020, 14:18
    #39984642
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
mayton,
это уже будет совсем другое решение: либо используем массив, либо список
...
Рейтинг: 0 / 0
28.07.2020, 14:43
    #39984654
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
mini.weblab
mayton,
это уже будет совсем другое решение: либо используем массив, либо список

Глупышка.

Задача Иосифа Флавия может быть решена на массиве таких элементов.

Код: plaintext
1.
2.
3.
4.
struct node {
	int id;
	struct node * next;
};



Во время удаления k-го элемента ты просто переставляешь указатель куда надо. И на этом все.

А форсированное освобождения одно элемента node не имеет никакого смысла в рамках
решения ДАННОЙ конкретной задачи. Возможно господа в топике имеют другое мнение. Или они
перфекционисты? Или они просто любят тратить мегафлопы на безсмысленные соблюдения
ритуалов?

Ведь в конце концов массив будет удалён целиком. И легко. Результат - один и тот-же. И без "ковровых
бомбардировок" memory.
...
Рейтинг: 0 / 0
28.07.2020, 15:05
    #39984661
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
mayton,
и да, и нет
(я уже сделала все тоже самое, только со списками)

1)
преимущество списка - возможность отжать память по максимуму (с массивом так не получится)
2)
преимущество массива - простое управление памятью
3)
список и удаление элементов, когда они больше не нужны - большое количество памяти будет резервироваться на короткий промежуток времени
...
Рейтинг: 0 / 0
28.07.2020, 15:25
    #39984667
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
mini.weblab,

тебе домашнее задание. Посчитай сколько памяти будет аллоцировано после malloc(sizeof(struct node))
для n элементов.
...
Рейтинг: 0 / 0
28.07.2020, 16:41
    #39984703
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C теория: освобождение памяти и использование глобальных переменных
mayton,

ну, например, на моем компьютере под структуру выделяется 16 байт,
хотя размер целого числа составляет 4 байта

Код: plaintext
1.
2.
3.
4.
struct node {
	int id;
	struct node * next;
};
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / C теория: освобождение памяти и использование глобальных переменных / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]