Cocos Creator的C++和Lua支持:0.4版发布 发现很多内存泄露的问题。。。

1:

“void CreatorReader::parseColliders(cocos2d::Node* node, const buffers::Node* nodeBuffer) const
{
const auto& collidersBuffer = nodeBuffer->colliders();
const auto& groupIndex = nodeBuffer->groupIndex();

Collider *collider = nullptr;
for (const auto& colliderBuffer : *collidersBuffer)
{
    const auto& type = colliderBuffer->type();
    const auto& offsetBuffer = colliderBuffer->offset();
    cocos2d::Vec2 offset(offsetBuffer->x(), offsetBuffer->y());
    
    if (type == buffers::ColliderType::ColliderType_CircleCollider)

collider = new CircleCollider(node, groupIndex, offset, colliderBuffer->radius());

else if (type == buffers::ColliderType::ColliderType_BoxCollider)
{
const auto& sizeBuffer = colliderBuffer->size();
cocos2d::Size size(sizeBuffer->w(), sizeBuffer->h());

collider = new BoxCollider(node, groupIndex, offset, size);

}
else if (type == buffers::ColliderType::ColliderType_PolygonCollider)
{
const auto& pointsBuffer = colliderBuffer->points();
std::vectorcocos2d::Vec2 points;
for (const auto& pointBuffer : *pointsBuffer)
points.push_back(cocos2d::Vec2(pointBuffer->x(), pointBuffer->y()));

** collider = new PolygonCollider(node, groupIndex, offset, points);**

}
else
assert(false);

    if (collider)
        _collisionManager->addCollider(collider);
}

}

2:
“void ColliderManager::addCollider(Collider* collider)
{
const auto& result = std::find(_colliders.begin(), _colliders.end(), collider);
if (result == _colliders.end())
{
for (auto& other : _colliders)
if (shouldColider(collider, other))

_contracts.pushBack(new Contract(collider, other));

_colliders.pushBack(collider);
}
}

这些加黑的标记都没有对应的 Delete 操作。

cocos2d::Vector的函数pushBack了解一下,pushBack有计数加1的操作。这段代码没有问题啊。_contracts可能在其它地方释放了。

Ref* Ref::autorelease()
{
PoolManager::getInstance()->getCurrentPool()->addObject(this);
return this;
}

虽然Collider 和 Contract 被cocos2d::Vecotr<…> 自动 引用计数加1 ,但是没有被用AutoReleaes, 导致 “ _colliders.erase(found);“, 引用计数从2 变成 1, 虽然变成1, 但是因为没有被AutoRelease , 所以 还是没有被执行 他们的析构函数, 我测试过啦。任何析构函数都没有被执行。

if (type == buffers::ColliderType::ColliderType_CircleCollider)
{
collider = new CircleCollider(node, groupIndex, offset, colliderBuffer->radius());
collider->autorelease();
}

    else if (type == buffers::ColliderType::ColliderType_BoxCollider)
    {
        const auto& sizeBuffer = colliderBuffer->size();
        cocos2d::Size size(sizeBuffer->w(), sizeBuffer->h());
        collider = new BoxCollider(node, groupIndex, offset, size);
        collider->autorelease();
    }
    else if (type == buffers::ColliderType::ColliderType_PolygonCollider)
    {
        const auto& pointsBuffer = colliderBuffer->points();
        std::vector<cocos2d::Vec2> points;
        for (const auto& pointBuffer : *pointsBuffer)
            points.push_back(cocos2d::Vec2(pointBuffer->x(), pointBuffer->y()));
        
        collider = new PolygonCollider(node, groupIndex, offset, points);
        collider->autorelease();
    }
    else
        assert(false);

全部加上AutoRelease 就可以自动析构啦。。 真是一个大坑