基本的に、構造体、クラス、またはメモリを手動で管理する new 演算子を使用せずに Arena Allocator を作成しようとしています。定義済みのサイズ、文字プール、割り当て方法、および 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 を書き込むアクセス違反