пятница, 1 февраля 2013 г.

Динамическое распределение памяти

При запуске процесса, его обьекты размещаются динамически (на этапе рантайм) в специально выделенной под эти нужны обвласти в опереративной памяти процесса, под названием куча.
Когда процесс запрашивает опеределенный обьем памяти в случае его наличия ОС выделяет эту память. Каждая процедура процесса должна по итогам своего выполенения освобождать выделенную память, если будут происходить утечки (процедура закончила выполнение, но где-то потеряла место освободжения), стек может переполниться и нарушить работу операционной системы.
Существует также проблема дефрагментации кучи, это когда по общему обьему памяти какбы хватает, но поскольку мы запрашиваем под массив достаточно много памяти, и нигде нет такого последовательного блока байт, мы не можем получить память под наш массив.
В случае сборщика муссора, кроме того, что он отслеживает память, которая потеряла ссылки на нее из всех мест процесса, и освобождет ее, он еще в случае необходимости делает дефрагментацию кучи.
В стандарте позикс Си имеет такие процедуры для работы с памятью:

#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

Комментариев нет:

Отправить комментарий