powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C теория: освобождение памяти и использование глобальных переменных
31 сообщений из 31, показаны все 2 страниц
C теория: освобождение памяти и использование глобальных переменных
    #39984424
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код: решение задачи Иосифа Флавия (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
C теория: освобождение памяти и использование глобальных переменных
    #39984428
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
2) из списка удалялись элементы, но память выделенная под эти элементы не освобождалась.
а почему?
Потому, что пофигу.
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984435
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
об этом как раз и вопрос: как определить, нужно освобождать или нет? и почему
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984438
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При завершении процесса вся занимаемая им память освобождается операционной системой
автоматически. Как и большинство других ресурсов этой самой операционной системы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984439
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
тогда, если все делать правильно, то нужно освобождать память
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984441
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теоретически - да, но операционка сделает это быстрее, не отвлекаясь на деструкторы
каждого мелкого объекта. Если у тебя выделены несколько миллионов кусков памяти по 20
байт, то лучше дать им умереть всем сразу, чем ждать пару минут.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984443
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab

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

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

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

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

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

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

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

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

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

Код: 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
C теория: освобождение памяти и использование глобальных переменных
    #39984518
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Профи, зайдя в топик тут-же закинули тему мемори-менеджмента.

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

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

Тезисно.

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

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

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

Глупышка.

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

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



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

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

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

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

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

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

Код: plaintext
1.
2.
3.
4.
struct node {
	int id;
	struct node * next;
};
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984705
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
malloc - хитрая штука. Может подкинуть свинью. Проверь сколько free осталось.
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984739
про malloc:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
# Выделение памяти дорого стоит:
- использовать пул предварительно выделенных объектов;

# Повторное использование объектов вместо освобождения:
- delete не включает системные вызовы (память не возвращается ОС);
     * Но: в glibc free есть 400 строк бухгалтерского кода;
- повторное использование объектов также помогает избежать фрагментации памяти.
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984743
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас нет ни первого ни второго пункта. Вообще массив который я предлагаю - это и есть по сути
одноразовый пул который используется в начале алгоритма Флавия. И массовое уничтожение объектов
- это быстрая операция удаления всего пула.

По сути такой себе кастомный GC.
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984750
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
У нас нет ни первого ни второго пункта. Вообще массив который я предлагаю - это и есть по сути
одноразовый пул который используется в начале алгоритма Флавия. И массовое уничтожение объектов
- это быстрая операция удаления всего пула.

По сути такой себе кастомный GC.

Там только добавление? Тогда reserve() нужно не забыть.
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984751
mayton
У нас нет ни первого ни второго пункта.

а чё у нас есть? после malloc() не надо делать free() ? Или о каких удалениях тут речь?
mini.weblab
2) из списка удалялись элементы, но память выделенная под эти элементы не освобождалась.
а почему? в каких случаях память должна освобождаться, а в каких нет?
...
Рейтинг: 0 / 0
C теория: освобождение памяти и использование глобальных переменных
    #39984754
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза, нет.

Мы будем хорошими зайчиками и сделаем malloc + free. Один раз. Чтоб следовать хорошему стилю управления
ресурсами. Но распыляться на мелочи мы не будем.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / C теория: освобождение памяти и использование глобальных переменных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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