Здесь есть два вопроса. Во-первых, если мне нужно создать b2BlockAllocator
до Clone
а потом удалить (где?) после клона? Инструмент профилирования XCode не показывает утечки C ++ …
b2FixtureDef fixd = fix->fixture;
const b2Shape *shape = fixd.shape;
if(shape->GetType()== b2Shape::e_polygon && flip)
{
b2PolygonShape* ps = (b2PolygonShape*)shape->Clone(new b2BlockAllocator());
for(int i=0;i<ps->m_vertexCount;i++)
{
ps->m_vertices[i].x *= -1;
ps->m_vertices[i].y *= -1;
}
ps->Set(&ps->m_vertices[0], ps->m_vertexCount);
body->CreateFixture(ps, 1.0f);
...
В этом коде я беру кешированный объект формы, клонирую его, изменяю вершины, устанавливаю для вычисления нормалей и присваиваю его объект для тела. Вопрос — это законно?
Обновить:
-(void) addFixturesToBody:(b2Body*)body forShapeName:(NSString*)shapeName flip:(BOOL)flip
{
BodyDef *so = [shapeObjects_ objectForKey:shapeName];
assert(so);
FixtureDef *fix = so->fixtures;
while(fix)
{
b2FixtureDef fixd = fix->fixture;
const b2Shape *shape = fixd.shape;
if(shape->GetType()== b2Shape::e_polygon && flip)
{
b2BlockAllocator allocator;
b2PolygonShape* ps = (b2PolygonShape*)shape->Clone(&allocator);
for(int i=0;i<ps->m_vertexCount;i++)
{
ps->m_vertices[i].x *= -1;
ps->m_vertices[i].y *= -1;
}
ps->Set(&ps->m_vertices[0], ps->m_vertexCount);
body->CreateFixture(ps, 1.0f);
}
else
{
NSLog(@"noflip...%@", shapeName);
body->CreateFixture(&fix->fixture);
}
fix = fix->next;
}
}
Я отвечаю на 4 года позже, пытаясь найти аналогичный ответ. Кажется, мало кто прошел лишнюю милю с Box2D.
Итак, вы определенно протекаете с new b2BlockAllocator
не удаляется нигде, ни вами, ни функцией Clone.
Просто создайте локальный b2BlockAllocator, чтобы он был уничтожен, когда он выходит за рамки видимости. И это все.
b2BlockAllocator cloneHelper;
b2PolygonShape* ps = (b2PolygonShape*)shape->Clone(&cloneHelper);
Я бы не использовал распределитель Box2D, потому что я бы не использовал b2Shape::Clone
метод. Не напрямую. Вместо этого я бы сделал следующее:
b2PolygonShape
,Set
на недавно созданный b2PolygonShape
назначить ему мои измененные вершины,b2PolygonShape
на первоначальном теле, вызвав тело b2Body::CreateFixture
метод иb2Body::DestroyFixture
способ избавиться от оригинального приспособления. b2BlockAllocator
класс может быть создан и использован для динамического выделения памяти, которая, в свою очередь, может использоваться в течение времени жизни b2BlockAllocator
например, но это было бы больше, чем необходимо для того, что вы пытаетесь сделать.