首页 > 解决方案 > 为什么我的程序崩溃并给出“分段错误(核心转储)”,但前提是我有太多对象?

问题描述

我正在用 SFML 制作烟花节目。在我制作太多烟花(粒子)之前,它看起来不错并且有效。当烟花爆炸并产生粒子时,程序崩溃并给出“分段错误(核心转储)”错误。该程序在崩溃之前根本没有减速。当它发生时,总是有 1025 个粒子。烟花也是粒子。我认为它没有帮助,但我在 linux 上。

我的代码:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <cmath>

sf::RenderWindow window;

class Particle;
std::vector<Particle> particles;

float gravity = 0.5;

class Particle
{
    public:
        sf::Vector2f pos = sf::Vector2f(0, 0);
        sf::Vector2f vel = sf::Vector2f(0, 0);
        sf::Vector2f acc = sf::Vector2f(0, 0);

        sf::CircleShape renderer = sf::CircleShape(2.5);

        bool isRocket = false;
        bool hasExploded = false;

        int lifetime = 255;

        Particle(sf::Vector2f position)
        {
            pos = position;
        }

        void ApplyForce(sf::Vector2f force)
        {
            acc += force;
        }

        void Update(int i)
        {
            if(!particles[i].isRocket)
            {
                vel.x *= 0.9;
                vel.y *= 0.9;
                lifetime -= 8;
                renderer.setRadius(renderer.getRadius() - 0.2);
                renderer.setFillColor(sf::Color(renderer.getFillColor().r, renderer.getFillColor().g, renderer.getFillColor().b, lifetime));
            }
            //Gravity
            ApplyForce(sf::Vector2f(0, gravity));

            vel += acc;
            pos += vel;
            acc.x = 0;
            acc.y = 0;

            if (particles[i].isRocket && !particles[i].hasExploded && particles[i].vel.y > 0)
            {
                particles[i].Explode(i);
            }


            if(lifetime < 0)
            {
                particles.erase(particles.begin() + i);
            }
        }

        void Render()
        {
            renderer.setPosition(pos);
            window.draw(renderer);
        }

        void Explode(int i)
        {
            particles[i].hasExploded = true;
            sf::Color color = sf::Color(rand() % 255, rand() % 255, rand() % 255);

            int explosionSize = rand() % 3 + 1;


            for (int i = 0; i <  explosionSize * 100; i++)
            {
                Particle fire(pos);
                fire.renderer.setFillColor(sf::Color(color.r + (rand() % 32 - 16), color.g + (rand() % 32 - 16), color.b + (rand() % 32 - 16)));
                fire.renderer.setRadius(rand() % 5 + 2);
                particles.push_back(fire);

                //color.r + (rand() % 32 - 16), color.g + (rand() % 32 - 16), color.b + (rand() % 32 - 16)

                float angle = (float(rand())/float((RAND_MAX)) * 2  * M_PI);
                float velocity = (float(rand())/float((RAND_MAX)) * 8 * explosionSize);
                particles[particles.size() - 1].ApplyForce(sf::Vector2f(velocity * cos(angle), velocity * sin(angle)));
            }
            particles.erase(particles.begin() + i);
        }
};

void sendRocket()
{
    Particle firework(sf::Vector2f(rand() % window.getSize().x, window.getSize().y));
    firework.isRocket = true;
    particles.push_back(firework);
    particles[particles.size() - 1].ApplyForce(sf::Vector2f(0, -((window.getSize().y * 0.025) + rand() % 8 - 4)   ));
}

int main()
{
    window.create(sf::VideoMode::getDesktopMode(), "Fireworks", sf::Style::Fullscreen);
    window.setFramerateLimit(60);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }
        }

        if(rand() % 10 == 0)
        {
            sendRocket();
        }
        std::cout<<particles.size()<<std::endl;
        for (int i = 0; i < particles.size(); i++)
        {
            particles[i].Update(i);
        }

        window.clear(sf::Color::Black);
        for (int i = 0; i < particles.size(); i++)
        {
            particles[i].Render();
        }
        window.display();
    }
    return 0;
}

我不是超级擅长编程,所以任何其他提示也将不胜感激。

标签: c++objectsegmentation-fault

解决方案


推荐阅读