При запуске процесса, его обьекты размещаются динамически (на этапе рантайм) в специально выделенной под эти нужны обвласти в опереративной памяти процесса, под названием куча.
Когда процесс запрашивает опеределенный обьем памяти в случае его наличия ОС выделяет эту память. Каждая процедура процесса должна по итогам своего выполенения освобождать выделенную память, если будут происходить утечки (процедура закончила выполнение, но где-то потеряла место освободжения), стек может переполниться и нарушить работу операционной системы.
Существует также проблема дефрагментации кучи, это когда по общему обьему памяти какбы хватает, но поскольку мы запрашиваем под массив достаточно много памяти, и нигде нет такого последовательного блока байт, мы не можем получить память под наш массив.
В случае сборщика муссора, кроме того, что он отслеживает память, которая потеряла ссылки на нее из всех мест процесса, и освобождет ее, он еще в случае необходимости делает дефрагментацию кучи.
В стандарте позикс Си имеет такие процедуры для работы с памятью:
В C++ методов меньше -- new и delete
Когда процесс запрашивает опеределенный обьем памяти в случае его наличия ОС выделяет эту память. Каждая процедура процесса должна по итогам своего выполенения освобождать выделенную память, если будут происходить утечки (процедура закончила выполнение, но где-то потеряла место освободжения), стек может переполниться и нарушить работу операционной системы.
Существует также проблема дефрагментации кучи, это когда по общему обьему памяти какбы хватает, но поскольку мы запрашиваем под массив достаточно много памяти, и нигде нет такого последовательного блока байт, мы не можем получить память под наш массив.
В случае сборщика муссора, кроме того, что он отслеживает память, которая потеряла ссылки на нее из всех мест процесса, и освобождет ее, он еще в случае необходимости делает дефрагментацию кучи.
В стандарте позикс Си имеет такие процедуры для работы с памятью:
#include <stdlib.h> void *malloc (size_t size);//выделить столько то байт void *calloc (size_t nelem, size_t elsize);//выделить столько то элементов по столько то байт void *realloc(void *ptr, size_t size);/*переопределить выделенную последовательность байт, если было больше, то лишние байты освбождаются, если стало больше и за старой последовательностью нет больше места, то эта память копируется в место где есть только последовательных свободных байт и старое место освобождается*/ void free(void *block);//освободить занятый блок
В C++ методов меньше -- new и delete
Комментариев нет:
Отправить комментарий