C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 99 - Частная куча для нашего класса / MSDN rus / Visual C++

Шаг 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];
}

Загрузить проект | | |
Автор Каев Артем.
[AD]