c++ - 如何使用 Box2D 分配器?

标签 c++ xcode memory-leaks box2d box2d-iphone

这里有两个问题。首先,如果我需要在 Clone 之前创建 b2BlockAllocator 然后在克隆之后删除(在哪里?)? 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);
...

在这段代码中,我获取缓存的形状对象,克隆它,修改顶点,设置计算法线并将它的对象分配给 body 。问题 - 这合法吗?

更新:

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

关于c++ - 如何使用 Box2D 分配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20501980/

相关文章:

c++ - 边界框方向

c++ - 为什么我应该更喜欢对智能指针的引用而不是智能指针作为 C++ 中的参数

c++ - 用于图像故障检测的逻辑回归

xcode - 在 iOS9 XCode 7 上运行应用程序的问题

c++ - alloca 返回的指针的基于索引的访问和 "placement new"的效果

c++ - 如果参数采用引用,在函数参数中传递 *this 会导致内存泄漏吗?

linux - pthread mutexattr 进程共享内存泄漏

c++ - 如果 C++ 编译器支持 Unicode 字符集,那么实现的基本字符集是否也必须是 Unicode?

xcode - 如何在点击一个 NSButton 后保持按下状态?

xcode - 该应用程序在 Payload/(App ID) : number, setNumber 中引用了非公共(public)选择器: