C++ C++;对象池:使用malloc时程序崩溃
我正在尝试创建一个简单的对象池,但我无法让它工作。 我的代码在使用malloc为模板类型的动态数组分配空间时崩溃 我的代码:C++ C++;对象池:使用malloc时程序崩溃,c++,templates,malloc,dynamic-arrays,objectpool,C++,Templates,Malloc,Dynamic Arrays,Objectpool,我正在尝试创建一个简单的对象池,但我无法让它工作。 我的代码在使用malloc为模板类型的动态数组分配空间时崩溃 我的代码: template <class cl> class ObjectPool{ public: gltAtlasRenderer* br; cl* items; int SIZE,texid; void Innit(int size,int texidi) { SIZE=size; item
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);
}
};
模板
类对象池{
公众:
gltatlas*br;
cl*项目;
int大小,texid;
无效Innit(整数大小,整数texidi)
{
大小=大小;
items=(cl*)malloc(sizeof(cl)*SIZE);->>>>>>>>>>>>>>>我的应用程序崩溃了
/*br=新的gltAtlasRenderer(大小,false,1);
texid=texidi;
用于(int c=0;cInnit(大小,texid);
}
我知道这条线正在崩溃,因为如果我推荐它,它不会崩溃这是行不通的:
ObjectPool<Enemie1>* enemies1;
void Innit()
{
enemies1->Innit(size,texid);
}
ObjectPool*enemies1;
无效因尼特()
{
enemies1->Innit(尺寸,texid);
}
您需要在使用之前分配内存,如下所示:
ObjectPool<Enemie1>* enemies1;
void Innit()
{
enemies1 = new ObjectPool<Enemie1>;
enemies1->Innit(size,texid);
}
ObjectPool*enemies1;
无效因尼特()
{
enemies1=新对象池;
enemies1->Innit(尺寸,texid);
}
这不起作用:
ObjectPool<Enemie1>* enemies1;
void Innit()
{
enemies1->Innit(size,texid);
}
ObjectPool*enemies1;
无效因尼特()
{
enemies1->Innit(尺寸,texid);
}
您需要在使用之前分配内存,如下所示:
ObjectPool<Enemie1>* enemies1;
void Innit()
{
enemies1 = new ObjectPool<Enemie1>;
enemies1->Innit(size,texid);
}
ObjectPool*enemies1;
无效因尼特()
{
enemies1=新对象池;
enemies1->Innit(尺寸,texid);
}
ObjectPool*enemies1;//这是未初始化的
无效因尼特()
{
enemies1->Innit(大小,texid);//这将调用未初始化指针上的方法
}
在Innit方法中,当通过无效指针将malloc的结果分配给正在分配的成员之一时,会导致崩溃
换成这个
ObjectPool<Enemie1> enemies1;
void Innit()
{
enemies1.Innit(size,texid);
}
ObjectPool-enemies1;
无效因尼特()
{
enemies1.Innit(尺寸,texid);
}
ObjectPool*enemies1;//这是未初始化的
无效因尼特()
{
enemies1->Innit(大小,texid);//这将调用未初始化指针上的方法
}
在Innit方法中,当通过无效指针将malloc的结果分配给正在分配的成员之一时,会导致崩溃
换成这个
ObjectPool<Enemie1> enemies1;
void Innit()
{
enemies1.Innit(size,texid);
}
ObjectPool-enemies1;
无效因尼特()
{
enemies1.Innit(尺寸,texid);
}
malloc()
不会调用类的构造函数:使用new[]
。向量是在运行时分配的。只需使用std::vector
将对象实例存储在中;它是在运行时分配的,可以随意调整大小(因此,如果需要,可以添加/删除实例)。如果你避免手动内存管理和指针操作,生活会轻松得多。@SteveL:1)请参阅hmjd的评论。2)标识符拼写错误是错误。Innit、texidi、Enemie1都指出了您在掌握英语方面存在的一些问题,这些问题在您遇到问题时可能是有害的,但应该加以解决,因为它们以后会制造麻烦。@ahenderson,这是一个C--程序。malloc()
不会调用类的构造函数:使用new[]
。向量是在运行时分配的。只需使用std::vector
将对象实例存储在中;它是在运行时分配的,可以随意调整大小(因此,您可以在必要时添加/删除实例)。如果你避免手动内存管理和指针操作,那么你的生活就会轻松得多。@SteveL:1)参见hmjd的评论。2)标识符拼写错误是错误。Innit、texidi、Enemei1都指出了你掌握英语的一些问题,这些问题可能会对你的问题造成伤害,但是应该解决,因为他们以后会制造麻烦。@ahenderson,这是一个C--程序。谢谢你,这解决了问题。我忘记了,因为我将池创建为指针,所以我也需要手动分配它:)谢谢,这解决了问题。我忘了,因为我将池创建为指针,所以我也需要手动分配它:)