В основном я пытаюсь создать Активатор Арены без использования структур, классов или нового оператора для ручного управления памятью. У меня есть определенный размер, пул символов, метод выделения и метод отображения freeMemory.Метод распределения и распределения атак Allacator Arena
Обратите внимание, что 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, и я считаю, у меня проблемы с инициализацией некоторых из этих переменных тоже.
Необработанное исключение в 0x000515f7 в MemoryManagerC.exe: 0xC0000005: Нарушение прав доступа месте для записи 0x00000004 на 0x8BADF00D
Я не вижу, как вы собрали '* test1 = 0xTESTMEEE' для компиляции. Это действительно ваш код? –
Да. Я имею в виду, что TESTMEEE является просто заполнителем. Я пробовал другие вещи, такие как 0x8BADF00D и FOO, ect. – user99999991
'pool [0]' является символом и будет переполняться после небольшого количества выделенных байтов. Почему бы вам просто не объявить 'size_t', чтобы держать' pos' в качестве поля? И что такое 'a'? – usr