All pastes #367463 Raw Edit

local new/delete

public cpp v1 · immutable
#367463 ·published 2007-02-22 10:48 UTC
rendered paste body
#include "stdafx.h"class kxMemoryChunk{public: // Methods	// *******************************************************************************************	kxMemoryChunk(size_t size = 0)	{		if(size == 0) 	{ 			return; 		}		m_Data =  malloc(size);		m_Size = size;	}	// *******************************************************************************************	~kxMemoryChunk()	{			}	// Pretizeni lokalniho new 	void* operator new(size_t size)	{			if(m_Count == 0) // Musime inicializovat begin a end		{			m_Begin.m_Prev = NULL;			m_Begin.m_Next = &m_End;			m_End.m_Prev = &m_Begin;			m_End.m_Next = NULL;		}				// Linknuti		kxMemoryChunk* ptr = (kxMemoryChunk*)malloc(size);		ptr->m_Prev = m_End.m_Prev;		ptr->m_Next = &m_End;		m_End.m_Prev->m_Next = ptr;		m_End.m_Prev = ptr;		m_Count++;				return ptr;	}	// Pretizeni lokalniho delete	void operator delete(void* ptr)  	{		kxMemoryChunk* chunk = (kxMemoryChunk*)ptr;		if(m_Count == 1)		{			m_Begin.m_Prev = m_Begin.m_Next = m_End.m_Prev = m_End.m_Next = NULL; // sichr je sichr		}		// Unlinknuti		chunk->m_Prev->m_Next = chunk->m_Next;		chunk->m_Next->m_Prev = chunk->m_Prev;				free(ptr);		m_Count--;	}	// Dalsi prasarna 	static kxMemoryChunk* GetBegin()	{		return &m_Begin;	}	// Dalsi prasarna	static kxMemoryChunk* GetEnd()	{		return &m_End;	}	// Pocet prvku	static unsigned long int GetCount()	{		return m_Count;	}	static void Delete(void* data_ptr)	{		kxMemoryChunk* tmp = m_Begin.m_Next;		while(tmp != &m_End)		{			if(tmp->m_Data == data_ptr)			{				delete tmp;				return;			}		}	}public:  // DATA	kxMemoryChunk* m_Prev;	kxMemoryChunk* m_Next;	void* m_Data;	size_t m_Size;protected: // Vsechno zverstvo se deje zde...	static kxMemoryChunk m_Begin;	static kxMemoryChunk m_End;	static unsigned long int m_Count; } ;// Inicializace statickych clenskych promennychunsigned long int kxMemoryChunk::m_Count = 0;// Pretizeni globalniho newstatic void* operator new(size_t size){	kxMemoryChunk* tmp = new kxMemoryChunk(size);	if(tmp->m_Data == NULL) // Pokud se nam nepodarilo alokovat data	{		delete tmp;		return NULL;	}	return tmp->m_Data;}// Pretizeni globalniho deletestatic void operator delete(void* ptr){	kxMemoryChunk::Delete(ptr);}