Множество – набор элементов.
Для множества определены операции:
Проектирование:
Текст – линейная последовательность слов (слово - линейная последовательность символов)
Текст – линейная последовательность строк, строки состоят из слов, слова – из символов и т.д.
Математическая модель текста – иерархическая структура представления (дерево).
При удалении разделов текста для освобождения звеньев следует учитывать следующие моменты:
Память, занимаемая удаляемым текстом, не освобождается, а удаление текста фиксируется установкой указателей в состояние 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;
}