0

基本的に、構造体、クラス、またはメモリを手動で管理する 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 を書き込むアクセス違反

4

3 に答える 3

0

コードに問題がある可能性があります。

char* pointer;
for(int i = 0; i < size; i++)
{
    *pointer = pool[i];

ここで問題なのは、これが一部のコンパイラで機能する可能性があることです (私の意見ではそうではありません)。

pointerhere は、割り当てられたものを指していません。だからあなたがするとき

*pointer = pool[i];

pool[i] はどこにコピーする必要がありますか? たとえば、このようにポインターを宣言したとしましょう。

char* pointer = NULL;

今、それは明らかです

*pointer = pool[i];

間違っている。 g++(私は気づいた)ポインタをNULLに初期化します。したがって、コードはセグメンテーション違反になります。VC++ は NULL initialize ではないため、動作する可能性がありますpointer。しかし、あなたは自分のものではない記憶場所に書き込んでいます。

于 2013-03-31T20:10:17.977 に答える