Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/50: Рейтинг темы: голосов - 50, средняя оценка - 4.52
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1

Сборщик мусора

01.12.2019, 19:38. Показов 9911. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Наткнулся на такие строки и прошу пояснить, что значит.

Во многих языках управление ресурсами в основном делегируется сбор­
щику мусора. С++ также предлагает интерфейс сборки мусора, так что вы
можете подключить сборщик мусора.

In many languages, resource management is primarily delegated to a garbage collector. C++
also offers a garbage collection interface so that you can plug in a garbage collector

На чем основывается этот интерфейс? И как его подключить. (это про сторонние библиотеки что ли?)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.12.2019, 19:38
Ответы с готовыми решениями:

Сборщик мусора
Доброго вам времени суток! У меня вопрос можно ли автоматизировать удаление объектов размещаемых в куче? (Желательно обойтись только STL).

задача не для новичков- сборщик мусора
под сборщиком мусора я понимаю алгоритм который освобождает всю память(динамическое выделение памяти) занятуя в результате работы...

Сборщик системной информации в Windows 8.1
люди, помогите написать программу которая будет работать под windows 8.1 и выводить информацию о процессоре, памяти и.т.д. Что вообще...

54
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
01.12.2019, 19:40
а дальше есть текст? может примеры будут.

Цитата Сообщение от _stanislav Посмотреть сообщение
На чем основывается этот интерфейс?
думаю речь про смарт поинтеры т.к по сути они реализуют идею сборщика мусора
Цитата Сообщение от _stanislav Посмотреть сообщение
И как его подключить.
#include <memory>
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
01.12.2019, 19:50  [ТС]
Источник:
Язык программирования C++. Краткий курс 2 издание, глава 5.3. Управление ресурсами.

Добавлено через 7 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
думаю речь про смарт поинтеры
наверно про то что С++ также предлагает интерфейс это действительно умные указатели, а про подключить сборщик мусора это стороннюю библиотеку.

Добавлено через 1 минуту
хз надеюсь что кто нибудь лучше толканет.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
01.12.2019, 19:52
Цитата Сообщение от _stanislav Посмотреть сообщение
наверно про то что С++ также предлагает интерфейс это действительно умные указатели, а про подключить сборщик мусора это стороннюю библиотеку.
так если речь про умные указатели, то зачем для них подключать стороннюю библиотеку когда есть стандартная?

Добавлено через 34 секунды
хотя если есть большое желание можно подтянуть буст и думать что все сделано как сказано в книжке ))
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
01.12.2019, 19:54  [ТС]
Undisputed, вот чуть побольше инфы если зацепило.

Во многих языках управление ресурсами в основном делегируется сбор­
щику мусора. С++ также предлагает интерфейс сборки мусора, так что вы
можете подключить сборщик мусора. Однако лично я считаю сборку мусора
последним вариантом - после исчерпания более ясных, более общих и луч­
ше локализованных альтернатив управления ресурсами. Мой идеал заклю­
чается в том, чтобы не создавать мусор, тем самым устраняя необходимость
в сборщике мусора: не мусори!
Сборка мусора фундаментально представляет собой глобальную схему
управления памятью. Умные реализации могут компенсировать эту глобаль­
ность, но по мере того, как системы становятся все более и более распреде­
ленными (вспомните о кешах, многоядерности и кластерах), локальность ста­
новится важнее, чем когда-либо ранее.
Кроме того, память не является единственным ресурсом. Ресурс - это
все, что должно быть захвачено и (явно или неявно) освобождено после ис-
пользования. Примерами ресурсов являются память, блокировки, сокеты,
дескрипторы файлов и потоков. Нет никакого сюрприза в том, что ресурс,
который является не просто памятью, называется ресурсом, не являющимся
памятью (non-memory resource). Хорошая система управления ресурсами
обрабатывает все разновидности ресурсов. Утечек следует избегать в любой
системе, работающей длительное время, но чрезмерное удержание ресурсов
может быть почти таким же плохим, как и утечка. Например, если система
удерживает память, блокировки, файлы и тому подобное в два раза дольше,
чем требуется, - потенциально такой системе требуется вдвое большее коли­
чество ресурсов.
Прежде чем прибегать к сборке мусора, систематически используйте де­
скрипторы ресурсов: пусть каждый ресурс имеет владельца в некоторой об­
ласти видимости и по умолчанию освобождается в конце области видимости
его владельца. В С++ это называется идиомой RAII (Resource Acquisition ls
lnitialization - захват ресурса есть инициализация) и интегрируется с обра­
боткой ошибок в форме исключений. Ресурсы могут перемещаться из одной
области видимости в другую с помощью семантики перемещения или "ин­
теллектуальных указателей'', а совместное владение может быть представле­
но "совместно используемым указателем" ( § 13 .2.1 ).
В стандартной библиотеке С++ идиома RAll очень распространена
для разных видов ресурсов, например для памяти (string, vector, map,
unordered _ map и т.д.), файлов (ifstream, ofstream и т.д.), потоков вы­
полнения (thread), блокировок (lock _guard, unique _ lock и т.д.) и объ­
ектов общего назначения (через unique _ptr и shared _ptr). Результатом
является неявное управление ресурсами, невидимое при обычном использо­
вании и приводящее к малой продолжительности захвата ресурсов.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
01.12.2019, 20:02
Лучший ответ Сообщение было отмечено _stanislav как решение

Решение

Цитата Сообщение от Undisputed Посмотреть сообщение
так если речь про умные указатели
Нет, не про них речь.

_stanislav, Undisputed,
http://www.stroustrup.com/C++11FAQ.html#gc-abi
3
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
01.12.2019, 20:09
DrOffset,
как я понял это предложение заключается в том что бы отслеживать что-то в этом духе
C++
1
2
3
4
5
6
void f()
{
    int *n = new int(1);
    std::cout << n;
    // память с адресом n будет освобождена автоматически
}
но так и сами до конца не решили как это корректно реализовать на уровне языка в целом
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.12.2019, 20:12
Цитата Сообщение от _stanislav Посмотреть сообщение
На чем основывается этот интерфейс? И как его подключить. (это про сторонние библиотеки что ли?)
это про стандартную мусоровозку,
которую завезли в язык уже как 9ть лет назад почти.

см раздел "Garbage collector support"
2
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
01.12.2019, 20:30  [ТС]
Undisputed, как я понимаю если указатель поменял свое значение мусоросборщик память сразу заберет:
C++
1
2
3
4
5
int* p = new int;
    p+=10;
    // ... collector may run here ...
    p-=10;
    *p = 10;    // тут уже память не наша
Добавлено через 4 минуты
а если нужно адресную арифметику юзать то нужно мусоросборщик предупреждать по ходу.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
01.12.2019, 20:32
_stanislav,
я вот до конца не понял как это работает"
может потом как нибудь еще раз попробую почитать
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
01.12.2019, 20:40
Цитата Сообщение от _stanislav Посмотреть сообщение
int* p = new int;
    p+=10;
а так не нужно делать. Так и без сборщика можно память почикать. Хотя и не будет сборщик с голым указателем что-то делать
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
01.12.2019, 20:43
Алексей1153,
А как "одеть" указатель?
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
01.12.2019, 20:45
Undisputed,
unique_ptr
shared_ptr

в посте #8 есть ссылка
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
01.12.2019, 21:25
Алексей1153,
Так DrOffset же пояснил что эта тема не про смарт принтеры

Добавлено через 22 минуты
_stanislav,
Чуточку вроде бы разобрался. Короче по идее если есть поддержка сборщика, то он время от времени запускается (возможно, в отдельном потоке), и "чистит" те адреса которые на его "взгляд" пора чистить. Например, если присвоить указателю nullptr. При этом надо быть осторожным. То есть если ты куда то скопировал этот адрес до присвоения исходной переменной nullptr, то копия этого адреса уже может указывать на просроченный участок. Если таких проблем хочется избежать как я понял надо применять к такому адресу std::declare_reachable. Это кстати и есть часть интерфейса gc (остальные функции интерфейса есть по ссылке выше на ФАГ Страуструпа). Но это все как я понял толком нигде не реализовали и стандарт как бы не настаивает на этом.

DrOffset,
Поправь плиз если я ошибаюсь

Добавлено через 10 минут
Алексей1153,
А что касается ссылки из 8 поста то hoggy указал подраздел который нужно смотреть. В
Этом подразделе явно нет смарт поинтеров
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.12.2019, 21:25
Цитата Сообщение от Undisputed Посмотреть сообщение
так если речь про умные указатели, то зачем для них подключать стороннюю библиотеку когда есть стандартная?
Попробуйте объяснить этому "умному" указателю слово "аллокатор". Впрочем, дизайн управления памятью на столько элегантен, что вы и велосипедному "умному" указателю не сможете объяснить что такое "аллокатор". По крайней мере без хаков. Потому как аллокатор хочет знать адрес объекта, а умный указатель возможно знает лишь указатель на базовый класс полиморфного объекта.
C++
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
#include<memory>
#include<new>
 
class Parent
{
public:
    virtual~Parent(){}
};
 
class SomeObject
{
public:
    virtual~SomeObject(){}
};
 
class Child:public SomeObject,public Parent
{
public:
};
 
int main()
{
    //delete без проблем удаляет объект Child по Parent* указателю
    Parent*object=new Child;
    delete object;
 
    std::allocator<Parent> parentAllocator;
    std::allocator<Child> childAllocator;
 
    //создаем массив разномастных потомков Parent.
    //Информация о реальном типе полиморфного объекта теряется
    Parent*array[2]={new (parentAllocator.allocate(1)) Parent,
                     new (childAllocator.allocate(1)) Child};
    //опять пытаемся удалить объект Child по Parent* указателю. Опс, программа падает
    parentAllocator.deallocate(array[1],1);
    return 0;
}
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
01.12.2019, 21:40
Renji,
Предположение о том что речь о смартпоинтерах было неверным поэтому честно говоря не понял к чему вы клоните
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.12.2019, 21:55
Цитата Сообщение от Undisputed Посмотреть сообщение
Предположение о том что речь о смартпоинтерах было неверным поэтому честно говоря не понял к чему вы клоните
В моем представлении оптимизация управления памятью начинается с аллокаторов. Ибо они серьезно влияют как на время выделения памяти, так и на оверхед (который может быть очень неприличным). Дальше в голове строится цепочка "если я стал думать о прикручивании сборщика мусора, у меня уже кастомный аллокатор висит. С аллокаторами вся эта фигня не совместима. Ну и нафига ее такую сделали? Лучше бы аллокаторы до ума довели". Но да, проблемы со смартпоинтерами здесь так, к слову.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.12.2019, 22:42
Цитата Сообщение от Renji Посмотреть сообщение
Попробуйте объяснить этому "умному" указателю слово "аллокатор".
std::allocate_shared?

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
//опять пытаемся удалить объект Child по Parent* указателю. Опс, программа падает
Делай через жопу, будет через жопу!
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.12.2019, 23:13
Цитата Сообщение от Croessmah Посмотреть сообщение
std::allocate_shared?
Хм, странно. Смотрел std::unique_ptr, аллокатора не нашел. У shared_ptr он действительно есть. При том что про shared_ptr лично я подумаю в последнюю очередь из-за накладных расходов на подсчет ссылок. Дизайн вызывает у меня еще большее недоумение.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
01.12.2019, 23:15
Цитата Сообщение от Renji Посмотреть сообщение
Хм, странно. Смотрел std::unique_ptr, аллокатора не нашел.
Потому что у unique_ptr другая задача и другое устройство.
Но можно прикрутить самостоятельно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.12.2019, 23:15
Помогаю со студенческими работами здесь

Очистка мусора
1. Если я на форме, в процессе работы, буду очень часто менять изображения на одном и том же pictureBox, то форма будет занимать большой...

Сборка мусора
Нужна ли в Си ++ «сборка мусора»? Почему возникает такая проблема и как она решается в Си++?

Функции и сборка мусора
Незнаю, туда ли поместил... Вобщем ситуация такая: про new(malloc()) и delete(free()) таки знаю немало, как и про динамическую(свободную)...

Уборка мусора из double
Подскажите, как убрать мусор из числа типа double. Например число 13 на самом деле не 13, а 13.00000001.

Как избавиться от записи мусора?
#include &lt;string.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; #include &lt;iostream.h&gt; #include &lt;iostream&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru