【发布时间】:2012-02-01 11:38:32
【问题描述】:
我一直在做一些关于游戏引擎开发的研究,最后我开始尝试编写一个 Memorymanager。我从 Eberly 的游戏引擎设计书中得到了这个想法。在构造函数中,我分配了一个内存块并为其添加了页眉和页脚,它们都具有大小属性并已使用。但现在我得到了一个 Access Writing Voilation。我已经听说过指针是 const 且只能读取的,但我不知道如何解决这个问题。
这是 MemoryManager.h 文件:
// MemoryManager.h - Header file //
#ifndef H_MemoryManager
#define H_MemoryManager
#include "IMemoryManager.h"
class HeaderBlock
{
public:
bool Used;
unsigned int Size;
HeaderBlock* Prev;
HeaderBlock* Next;
};
class FooterBlock
{
public:
bool Used;
unsigned int Size;
};
class MemoryManager : public IMemoryManager
{
private:
int m_MemoryBudget;
char* m_FullMemory;
HeaderBlock* m_FreeBlock;
int m_hsize; // Size of the header
int m_fsize; // Size of the footer
int m_hfsize; // Size of the HeaderandFooter
public:
// Constructor and Destructor
MemoryManager(int Budget);
virtual ~MemoryManager();
// Functions
virtual char* Allocate(unsigned int RequestSize);
virtual char* Deallocate(char* pDeallocate);
HeaderBlock* SearchByPolicy(unsigned int RequestSize);
};
#endif
这是构造函数的实现:
MemoryManager::MemoryManager(int Budget)
{
m_MemoryBudget = Budget;
m_FullMemory = (char*)malloc(m_MemoryBudget);
m_hsize = sizeof(HeaderBlock);
m_fsize = sizeof(FooterBlock);
m_hfsize = m_hsize + m_fsize;
HeaderBlock* header = (HeaderBlock*)m_FullMemory;
header->Used = false;
header->Size = m_MemoryBudget;
FooterBlock* footer = (FooterBlock*)(m_FullMemory + m_MemoryBudget - m_fsize);
footer->Used = false;
footer->Size = m_MemoryBudget;
header->Prev = header;
header->Next = header;
m_FreeBlock = (HeaderBlock*)m_FullMemory;
}
这是我在错误时得到错误的分配方法
usedHeader->Used = true;
usedFooter->Used = true;
freeHeader->Used = false;
freeFooter->Used = false; // HERE I GET THE EXCEPTION
char* MemoryManager::Allocate(unsigned int RequestSize)
{
HeaderBlock* header = SearchByPolicy(RequestSize);
if(header == NULL)
{
return NULL;
}
unsigned int Size = header->Size;
FooterBlock* footer = (FooterBlock*)((header + Size - m_fsize));
// 1.The size to be allocated fits EXACTLY in the Block pointed by header.
if(Size == RequestSize + m_hfsize)
{
char* allocated = (char*)header + m_hsize;
header->Used = true;
footer->Used = true;
if(header->Next == header)
{
// This is the only block on the free list
m_FreeBlock = 0;
}
else
{
m_FreeBlock->Prev->Next = m_FreeBlock->Next;
m_FreeBlock->Next->Prev = m_FreeBlock->Prev;
m_FreeBlock = m_FreeBlock->Next;
}
return allocated;
}
// 2. The block has more storage than is needed for the allocation request.
if(Size >= RequestSize + 2*m_hfsize)
{
char* allocated = (char*)(header + m_hsize);
// Split the block in a "Used"-Block and a "Free"-Block
HeaderBlock* usedHeader = header;
FooterBlock* usedFooter = (FooterBlock*)(header + m_hsize + RequestSize);
HeaderBlock* freeHeader = (HeaderBlock*)(usedFooter + m_fsize);
FooterBlock* freeFooter = footer;
usedHeader->Used = true;
usedFooter->Used = true;
freeHeader->Used = false;
freeFooter->Used = false;
unsigned int usedSize = RequestSize + m_hfsize;
freeHeader->Size = header->Size - usedSize;
usedHeader->Size = usedSize;
freeHeader->Prev = header->Prev;
freeHeader->Next = header->Next;
m_FreeBlock = freeHeader;
return allocated;
}
// 3. The block has more storage then the Request, but to less to divide into two blocks.
char* allocated = (char*)header + m_hsize;
header->Used = true;
footer->Used = true;
//Detach from the free list;
if(header->Next == header)
{
// This is the only block on the free list
m_FreeBlock = 0;
}
else
{
m_FreeBlock->Prev->Next = m_FreeBlock->Next;
m_FreeBlock->Next->Prev = m_FreeBlock->Prev;
m_FreeBlock = m_FreeBlock->Next;
}
return allocated;
}
我已经检查了 SearchByPolicy 函数是否返回一个有效指针,如果它可以找到比请求更大的内存块,它确实返回一个有效指针。
希望你能帮帮我!
【问题讨论】:
标签: c++ exception pointers memory-management