1

该代码在 Linux 环境中运行良好,但在 Windows 中,它在程序启动后 5-10 秒崩溃。调试器指向n->fired = true;问题?

void ParticleSystem::PrivProcessParticles(pNodePtr n, double frameTime)
{
      while(n != NULL) {
        n->fired = true;
        if(!n->immortal)
            n->life -= frameTime; //Decrement life
        n->particle.ApplyAccel2D(frameTime);

        /* Since the oldest particles will always be on
           top of the queue, if life is zero, dequeue! */
        if(n->life <= 0) {
            if(head != NULL && !n->immortal) {
                pNodePtr curr;
                curr = head;
                head = head->next;
                delete curr;
            }
        }
        n = n->next;
    }
}

分配:

void ParticleSystem::AddParticle(double lifeIn, double x, double y, double angle,
                                 double size, double force, bool immortalIn)
{
    //Increment particle count
    count++;

    //Allocate
    pNodePtr n = new particleNode;

    //Initialize
    n->particle.CreateQuad(size);
    n->particle.SetTexture(texture);
    n->particle.SetPos2D(x, y);
    n->particle.SetRot2D(angle);
    n->particle.SetTopSpeed(topSpeed);
    n->particle.SetVelocity(force);

    n->life = lifeIn;
    n->immortal=immortalIn;
    n->fired = false;
    n->next = NULL;

    //Place
    if (head == NULL) 
    {
        head = n;
        tail = n;
        n->next = NULL;
    } else {
        tail->next = n;
        tail = n;
    }
}

节点:

struct particleNode {
        Quad particle;
        double life;
        bool fired;
        bool immortal;
        particleNode* next;
};
4

1 回答 1

1

没有足够的信息发布。但是,这是问题的一个潜在来源。

当您的PrivProcessParticles函数对 执行其迭代时n,它可以决定删除head列表中的元素。但是有没有可能,在它决定删除的那一刻headn其实是一样的head呢?如果是这样,删除head就会n变成一个悬空指针,这会导致灾难性的后果n = n->next

添加assert(curr != n)之前delete curr并查看该断言是否成立或失败。

n无论如何,调用者传递给的起始值是PrivProcessParticles多少?有没有可能碰巧和 一样head

PS 另外,出于好奇,您用来决定是否执行删除的逻辑似乎表明该决定实际上是关于节点的n(您检查n->life <= 0n->immortal)。但是然后您继续删除head,而不是n...这是设计使然吗?

PPS 挑剔:您n->next = NULLAddParticle.

于 2013-05-09T20:45:51.180 回答