C++ пул объектов: происходит сбой программы при использовании malloc

Я пытаюсь сделать простой пул объектов, и я не могу заставить его работать. Мой код падает при использовании 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);
    }
};

Все примеры, которые я нашел в сети, используют фиксированные массивы и векторы, но мне нужно, чтобы массив выделялся во время выполнения.

РЕДАКТИРОВАТЬ: Вот как я его создаю:

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

Я знаю, что происходит сбой в этой строке, потому что, если я рекомендую это, он не падает

2 ответа

Решение

Это не будет работать:

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

Вам необходимо выделить память перед ее использованием, вот так:

ObjectPool<Enemie1>* enemies1;
void Innit()
{
         enemies1 = new ObjectPool<Enemie1>;
         enemies1->Innit(size,texid);
}
ObjectPool<Enemie1>* enemies1; //This is uninitialized
void Innit()
{
     enemies1->Innit(size,texid); //This calls a method on an uninitialized pointer
}

В методе Innit, когда вы присваиваете результат malloc одному из членов, которые вы назначаете через недопустимый указатель, который вызывает сбой.

Измени это на это.

ObjectPool<Enemie1> enemies1;
void Innit()
{
     enemies1.Innit(size,texid);
}
Другие вопросы по тегам