LINUX.ORG.RU

Что произойдет если не делать сборку мусора в программировании?

 , , ,


0

3

Привет! Можете объяснить что произойдет, если не сделать сборку мусора? Например в elixir есть атомы, они никогда не очищаются автоматически. В си также по ручному же да кажется он очищается, с++ также? Что если у меня будет накапливаться атомы|константы и т.д? Он взорвется?💣🔥



Последнее исправление: superteremok (всего исправлений: 1)

Так вот почему корабли Илона Маска взрываются!

dnb ★★★★
()
Ответ на: комментарий от menangen

а что такое переполнение стека? это ли имеется ввиду, не очистка с сборкой мусора? или? я конечно в википедии читал что такое переполнение стека, но там я так понял, не совсем не то написано. или я хз, голова разбухла гороче.

superteremok
() автор топика

Пямять кончится и перестанут выделяться новые объекты. Будет либо NULL, либо исключение, либо OOM-killer.

X512 ★★★★★
()

Лучше использовать local memory.
Если и не очистите память, то операционная система за вас эту работу сделает.
В целом все зависит от решаемой задачи и данных.
Одно дело разрабатывать видео редактор, который не очищает память и другое, текстовый редактор.

Правильно конечно - использовать свой/чужой allocator.

Владимир

anonymous
()

Что произойдет если не делать сборку мусора в программировании?

Зависит от того что делает и как будет написана программа, от равного или постоянного большего до постоянно растущего объёма ОЗУ(это называется утечкой памяти).

torvn77 ★★★★★
()

память будет быстро сожрана.

XoFfiCEr ★★☆☆
()

Если не будешь убираться в комнате, то мамка заругает.

ox55ff ★★★★★
()

Ответ зависит от размера программы.

fernandos ★★★
()
Ответ на: комментарий от superteremok

Так а что такое стек ты тоже не знаешь? Переполнение стека можно разными путями осуществить, но это надо постараться… Например, если ты внутри функции пытаешься выделить очень большой блок памяти

int foo()
{
    int array[1000000];
}
menangen ★★★★★
()

Будет out of memory, и процесс упадет, рано или поздно.

Атомы Elixir/Erlang не чистятся, ага. Поэтому их нельзя генерировать динамически. Если нужны динамические ключи – используй строки.

anonymous
()
Ответ на: комментарий от superteremok

Переполнение стека, это когда есть возможность заставить алгоритм записать за границы буфера выделенного на стеке в текущем стековом фрейме. Т.е. это частный случай переполнения буфера. Почему его выделяют особо - раньше(условно раньше, т.к. на многих микроконтроллерах и прочих bare metal это до сих пор актуально), когда можно было невозбранно переписать адрес возврата и передать управление на код в памяти в стеке - это было лёгким способом получить удалённое выполнение кода. А переполнение буфера не на стеке - использовать гораздо сложнее.

pon4ik ★★★★★
()
Ответ на: комментарий от superteremok

стек - это память, которая выделяется под переменные, когда вызывается функция. Если ты вызвал F, которая вызвала G, которая вызвала H, на стеке будут переменные для F, переменные для G и переменные для H, пока H не вернётся. Переполнение будет, если одна функция вызовет другую, та третью, та четвёртую, и так далее достаточно много раз, так что в итоге они отожрут больше памяти чем под стек отведено (вроде обычно под стек фиксированный объём отводится)

dumdum
()
Последнее исправление: dumdum (всего исправлений: 1)

Он взорвется?

Кто «он»?

seiken ★★★★★
()

Если ты не будешь срать месяц, что у тебя взорвется?🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥

anonymous
()
Ответ на: комментарий от pon4ik

Это скорее исчерпание стека:)

В некоторых компиляторах без специальных флагов этот код может перепрыгнуть защитную страницу и перезаписать память перед стеком.

По умолчанию только MSVC правильно компилирует, GCC и Clang не вставляют код пробы защитной страницы.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)

Что если у меня будет накапливаться атомы|константы и т.д? Он взорвется?

Да

anonymous
()
Ответ на: комментарий от X512

Ты сейчас про какую опцию сборки? И что считать умолчаниями - ванильный gcc или флаги сборки в дистрибутивах? Я не уверен на 100% но, по идее это должно приводить в худшем случае к ошибке доступа, если это не так, то это лол конечно, в любом случае интересно, если знаешь детали.

pon4ik ★★★★★
()
Ответ на: комментарий от X512

По умолчанию только MSVC правильно компилирует, GCC и Clang не вставляют код пробы защитной страницы.

Опять этот бред. Где в стандарте указано требование вставлять пробы защитной страницы?

Siborgium ★★★★★
()
Ответ на: комментарий от pon4ik

Ты сейчас про какую опцию сборки?

-fstack-protector-strong.

X512 ★★★★★
()
Ответ на: комментарий от Siborgium

Где в стандарте указано требование вставлять пробы защитной страницы?

Где в стандарте написано, что можно портить случайную память при нехватке памяти?

X512 ★★★★★
()
Ответ на: комментарий от pon4ik

Хм, а как в msvc это обходят?

MSVC:

array$ = 32
__$ArrayPad$ = 4000032
void Do(void) PROC                               ; Do, COMDAT
$LN4:
        mov     eax, 4000056                          ; 003d0938H
        call    __chkstk
        sub     rsp, rax
        mov     rax, QWORD PTR __security_cookie
        xor     rax, rsp
        mov     QWORD PTR __$ArrayPad$[rsp], rax
        lea     rcx, QWORD PTR array$[rsp]
        mov     DWORD PTR array$[rsp], 1
        call    void DoInt(int *)                 ; DoInt
        mov     rcx, QWORD PTR __$ArrayPad$[rsp]
        xor     rcx, rsp
        call    __security_check_cookie
        add     rsp, 4000056                          ; 003d0938H
        ret     0
void Do(void) ENDP                               ; Do

GCC, Clang:

Do():
        sub     rsp, 4000008
        mov     rdi, rsp
        mov     DWORD PTR [rsp], 1
        call    DoInt(int*)
        add     rsp, 4000008
        ret

Исходник:

void DoInt(int *arr);

void Do()
{
    int array[1000000];
    array[0] = 1;
    DoInt(array);
}

X512 ★★★★★
()
Ответ на: комментарий от pon4ik

Просто если речь про канареек, то они уже давно везде по-умолчанию включены.

Во-первых только они не помогут при переполнении стека, во-вторых судя по https://godbolt.org/, по умолчанию они включены только в MSVC.

X512 ★★★★★
()
Ответ на: комментарий от pon4ik

Хм, а как в msvc это обходят?

Технология в общих чертах следующая: при выделении неинициализированной памяти на стеке размером больше 4096 байт компилятор вставляет код, который обходит выделенную на стеке память с шагом 4096 и пытается прочитать на каждом шаге. Если произошло переполнение стека, то при обходе произойдёт обращение к защитной странице и SIGSEGV.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

Умолчания ванильной сборки gcc и того что идет в дистре обычно отличаются, хотя точно именно про всякий hardening могу сказать только про rhel7+

pon4ik ★★★★★
()
Ответ на: комментарий от menangen

Программа будет работать быстро, но не долго

Абстрактная машина Тьюринга будет работать долго, но не быстро, ибо количество дырочек на ленте не ограничено.

quickquest ★★★★★
()
Ответ на: комментарий от anonymous

откуда ты взял быстроту для абстрактной

При конечном времени шага время перехода на дальние адреса будет асимтотически стремиться к бесконечности.

quickquest ★★★★★
()

В программировании уже давно пора сделать сборку мусора, с последующим сжиганием или переработкой в биореакторе.

anonymous
()

Не ответ на вопрос, но комментарий по теме.

Возьмём для примера тетрис. Так как в полёте у нас только один элемент, то для всех элементов, появляющихся на экране будет достаточно одного изменяющегося объекта в памяти. Это примерно 4 байта.

Но мутабельность не в моде. Поэтому для каждого нового элемента будем создавать новый объект в памяти. Но и тут память сложно переполнить. Если один элемент в среднем летит 4 секунды, то потребуется 1 байт в секунду. Соответственно, гигабайт мы займём за 34 года.

Однако не будем забывать про мощь ООП. И на каждый элемент мы будем выделять не 4 байта, а 4 килобайта с подробным описанием характеристик элемента, компьютера, игрока и т.д. в формате xml. Тут мы займем гигабайт за 12 суток игры.

12 суток нормальные люди в тетрис не играют, но я верю, что веб-фреймворки помогут таки заполнить память за несколько минут. И тут мы поймём, что без сборки мусора никуда.

Kogrom
()

Что если у меня будет накапливаться атомы|константы и т.д? Он взорвется?

Нет

anonymous
()

макаки умрут вместе со своим говнокодом. остальные ничего не заметят, потому что у них и не было никакой «сборки мусора».

Iron_Bug ★★★★★
()
Ответ на: комментарий от menangen

Вы переполните свой стек технологий …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Давно тебя тут не было. Где пропадал?

Меня тут много тролили, поэтому не заходил на форум. Занимался домом, программировал, работал …

Владимир

anonymous
()

Зачем ты ставишь тег "С" там, где упоминается исключительно С++?

В С (к счастью) нет никакой "сборки мусора"! Ты сам делаешь то, что пожелаешь. И за это я обожаю этот ЯП!!! Где еще найдешь такую прелесть, где можно себе не только ногу прострелить, но вообще при желании из гранатомета самоубиться?

P.S. Ура, Iron_Bug жива!!! Да здравствуют вменяемые программисты в этом логове вендузятников!

// блин, как давно я на ЛОРе не был: уже так все поломали, что юзерскрипт совсем перестал вменяемо работать: даже "кавычки" не оставляет во вменяемом виде.

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 2)
Ответ на: комментарий от quickquest

Стало только хуже.

Допустим ты имел в виду ненулевое. Строгоположительное. И сложил из него монотонно возрастающее с расстоянием перехода.

Вопрос анона «где ты его взял» стоит все так же остро.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

И сложил из него монотонно возрастающее с расстоянием перехода. Вопрос анона «где ты его взял» стоит все так же остро.

Дык, «лента с дырочками» – это не современное адресное пространство с jmp-адресацией. До нужного монотонно возрастающего адреса ползти нужно не за 1 сложение, а последовательно, по шагам, считаемым счётчиком машины. Время шагания будет стремиться к бесконечности.

quickquest ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.