При удалении разделов текста для освобождения звеньев следует учитывать следующие моменты:
Память, занимаемая удаляемым текстом, не освобождается, а удаление текста фиксируется установкой указателей в состояние NULL (например, pFirst=NULL
).
Возможный подход доступа к системе управления памятью – разработка специальной системы управления при помощи перегрузки операторов new
и delete
.
TTextLink
создается статическая переменная MemHeader
типа TTextMem
class TTextMem{
PTTextLink pFirst; // первое звено
PTTextLink pLast; // последнее звено
PTTextLink pFree; // первое свободное
InitMemSystem
класса TTextLink
void TTextLink::InitMemSystem(int size) // инициализация памяти
{
char Line[100];
char *tmp = new char[sizeof(TTextLink)*size];
MemHeader.pFirst = (PTTextLink)new char[sizeof(TTextLink)*size];
MemHeader.pFree = MemHeader.pFirst;
MemHeader.pLast = (PTTextLink)tmp + size - 1;
PTTextLink pLink = MemHeader.pFirst;
for (int i = 0; i < size - 1; i++, pLink++) // размер памяти
pLink->pNext = pLink + 1;
pLink->pNext = nullptr;
}
void* TTextLink::operator new(size_t size) // выделение звена
{
PTTextLink pLink = MemHeader.pFree;
if (MemHeader.pFree != nullptr)
MemHeader.pFree = pLink->pNext;
return pLink;
}
delete
звено включается в список свободных звеньевvoid operator delete (void *pM)
{
PTTTextLink pLink = (PTTTextLink)pM;
pLink->pNext = MemHeader.pFree;
MemHeader.pFree = pLink;
}
(при сбалансированном дереве) (при вырожденном дереве)
Из последнего выражения следует:
умножим на
подставим (3) в (1)
Отсюда можно получить (проверяется подстановкой):
(формула Эйлера, )
Пусть есть средняя длина пути для идеально сбалансированного дерева