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

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

01.12.2019, 19:38. Показов 9870. Ответов 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
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
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
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,055
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
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,055
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
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 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
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 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): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru