0

単純なオブジェクト プールを作成しようとしていますが、うまく動作しません。malloc を使用してテンプレートの型の動的配列にスペースを割り当てると、コードがクラッシュする

私のコード:

template <class cl>
class ObjectPool{
public:
    gltAtlasRenderer* br;
    cl* items;
    int SIZE,texid;

    void Innit(int size,int texidi)
    {
        SIZE=size;
        items=(cl*)malloc(sizeof(cl)*SIZE);->>>>>>>>>>HERE MY APP CRASHES
        /*br=new gltAtlasRenderer(SIZE,false,1);
        texid=texidi;
        for(int c=0;c<SIZE;c++)items[c].alive=false;
        */
    }
    void Update(Arena*  arena)
    {
        for(int c=0;c<SIZE;c++)
        {
            if(!items[c].alive)continue;
            items[c].Update(arena);
        }
    }
    void Render()
    {
        br->RenderStart();
        for(int c=0;c<SIZE;c++)
        {
            if(!items[c].alive)continue;
            items[c].Render(br);
        }
        br->RenderStop(texid);
    }
};

Web で見つけたすべての例は固定配列とベクトルを使用していますが、実行時に配列を割り当てる必要があります。

編集:これは私がそれを作成する方法です:

ObjectPool<Enemie1>* enemies1;
void Innit()
{
         enemies1->Innit(size,texid);
}

その行でクラッシュしていることは知っていますが、それを称賛するとクラッシュしません

4

2 に答える 2

4

これは機能しません:

ObjectPool<Enemie1>* enemies1;
void Innit()
{
         enemies1->Innit(size,texid);
}

次のように、使用する前にメモリを割り当てる必要があります。

ObjectPool<Enemie1>* enemies1;
void Innit()
{
         enemies1 = new ObjectPool<Enemie1>;
         enemies1->Innit(size,texid);
}
于 2012-08-16T13:38:22.770 に答える
0
ObjectPool<Enemie1>* enemies1; //This is uninitialized
void Innit()
{
     enemies1->Innit(size,texid); //This calls a method on an uninitialized pointer
}

Innit メソッドで、割り当てているメンバーの 1 つに malloc の結果を割り当てると、クラッシュの原因となる無効なポインターを介して割り当てられます。

これに変更します。

ObjectPool<Enemie1> enemies1;
void Innit()
{
     enemies1.Innit(size,texid);
}
于 2012-08-16T13:40:50.207 に答える