Шаг 99 - Частная куча для нашего класса

Частная куча - это куча созданная для распределения в памяти некоторых объектов, что позволяет обходить стандартные механизмы использования кучи. Основная идея использования частных куч на том, что все объекты одного размера будут находиться в свой куче. Это позволяет избегать ее фрагментации. Если есть несколько объектов разного размера, то нужно несколько куч. То есть каждый класс должен управлять своей кучей.

99_1.gif (3906 b)

Итак, как же реализуется частная куча. Идея такая. В классе заводиться указатель на частную кучу и перегружается оператор new и delete. Ниже приводиться пример простого класса с реализацией частной кучи.

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

class CObj1				// Это - наш класс
{
	static HANDLE m_hHeap;		// Это - наша куча
public:
	void* operator new(size_t s);	// А это - Перегруженные операторы
	void operator delete(void *p);
	int x1;				// Данные к классе
	int x2;
	int x3;
};

HANDLE CObj1::m_hHeap=NULL;			// начальное состояние

void* CObj1::operator new(size_t s)
{
	void *p;
	if (m_hHeap==NULL)			// если куча не создана
	{
		SYSTEM_INFO inf;
		GetSystemInfo(&inf);	// получить информация о системе
		m_hHeap = HeapCreate(0,inf.dwAllocationGranularity,0);  // создать кучу
	}
	p=HeapAlloc(m_hHeap,0,s);		// выделить память
	return p;				// вернуть указатель на созданный объект
}

void CObj1::operator delete(void *p)	
{
	HeapFree(m_hHeap,0,p);		// освободить данные из кучи
}

void main()
{
	CObj1* cobj[10];			// Массив объектов
	cobj[0]=new CObj1();		// выделяем память
	cobj[0]->x1=10;
	cobj[1]=new CObj1();
	delete cobj[0];
	delete cobj[1];
}

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 01.07.2001