基本上,我正在尝试创建一个 Arena Allocator,而不使用结构、类或 new 运算符来手动管理内存。我有一个定义的大小、一个字符池、一个分配方法和一个 freeMemory 显示方法。
请注意,这pool[0]
是我的索引,它将跟踪上次填充内存的位置。
const int size = 50000;
char pool[size];
void start() {
pool[0] = 1;
}
int freeMemory(void) {
int freemem = 0;
for(int i = 0; i < size; i++) {
if(pool[i] == NULL) {
freemem++;
}
}
return freemem;
}
void* allocate(int aSize)
{
if(freeMemory() == 0)
{
out();
}
else
{
char* p = NULL;
int pos = pool[0];
pool[pos] = (char) a;
p = &pool[pos];
pool[0] += a;
return((void*) &pool[pos]);
}
}
在 main.cpp 中:
start();
long* test1 = (long *) allocate(sizeof(long));
cout << freeMemory() << endl; //Returns 49999
*test1 = 0x8BADF00D; //Breaks here
cout << freeMemory() << endl;
当我尝试使用 0x8BADF00D 时它会中断,我相信我在初始化其中一些变量时也遇到了问题。
MemoryManagerC.exe 中 0x000515f7 处未处理的异常:0xC0000005:0x8BADF00D 上的访问冲突写入位置 0x00000004