C++对象池:使用 malloc 时程序崩溃

C++ object pool: program crashes when using malloc

本文关键字:程序 崩溃 malloc 使用 对象 C++      更新时间:2023-10-16

我正在尝试制作一个简单的对象池,但我无法让它工作。使用 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);
}

我知道那条线正在崩溃,因为如果我赞扬它,它不会崩溃

这不起作用:

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);
}