渲染器和对象之间的 C++ SFML 段错误

C++ SFML Segfault between renderer and object

在开始之前,我要为我可能犯的任何看似明显的错误提前道歉。在这一点上我很困惑,这里可能有很多错误。 任何关于修复我所拥有的东西的建议,或者更好的设置我想要的东西的方法,我们都将不胜感激。

我有两个 类,渲染器和 FParticle。

我想要的是 FParticle 构造函数将其自身的指针传递给渲染器。渲染器会将各种 FParticle 指针存储在一个向量中,然后在调用 DrawObjects() 时,它将使用指针列表绘制所有对象。

这样我就不必担心在游戏循环的每一步都将每个粒子传递到渲染器中,而是可以直接从指针列表中绘制它们。

问题是程序出现段错误,我不知道如何处理。

段错误发生在renderer.cpp

文件在这里:

renderer.h

#pragma once
#ifndef RENDERER_H
#define RENDERER_H

#include <SFML/Graphics.hpp>

#include <vector>

class FParticle;

class Renderer {
private:
  std::vector<const FParticle*> object_buffer_;
  sf::RectangleShape rectangle_;

public:
  Renderer();
  void addObject(const FParticle &object);
  void drawObjects(sf::RenderWindow &window);

};

#endif // RENDERER_H

renderer.cpp

#include "renderer.h"
#include "fparticle.h"

#include <iostream>

Renderer::Renderer() {}

void Renderer::addObject(const FParticle &object)
{
  object_buffer_.push_back(&object);
}

void Renderer::drawObjects(sf::RenderWindow &window)
{
  for (int i = object_buffer_.size(); i > 0; i--)
  {
    rectangle_.setSize(object_buffer_[i]->get_size()); // <------- SEGFAULT HERE
    rectangle_.setPosition(object_buffer_[i]->get_position());
    rectangle_.setFillColor(sf::Color::White);

    std::cout << object_buffer_[i]->get_size().x << std::endl;

    window.draw(rectangle_);
  }

}

fparticle.h

#pragma once
#ifndef FPARTICLE_H
#define FPARTICLE_H

#include <SFML/Graphics.hpp>

class Renderer;

class FParticle
{
protected:
  sf::Vector2f size_;
  sf::Vector2f position_;
  sf::Vector2f velocity_;
  sf::Vector2f acceleration_;

  float inverse_mass_;

  float damping_;

public:
  FParticle(Renderer &picasso);

  sf::Vector2f get_size() const;
  sf::Vector2f get_position() const;

  void set_mass();
  void set_inverse_mass();

};

#endif // FPARTICLE_H

fparticle.cpp

#include "fparticle.h"
#include "renderer.h"

#include <iostream>

FParticle::FParticle(Renderer &picasso)
{
  size_.x = 5.f;
  size_.y = 5.f;

  position_.x = 10.f;
  position_.y = 10.f;

  picasso.addObject(*this);
}

sf::Vector2f FParticle::get_size() const
{
  return size_;
}

sf::Vector2f FParticle::get_position() const
{
  return position_;
}

伪main.cpp

int main()
{
  Renderer picasso;
  FParticle p1(picasso);

  while(gamestate != Exiting)
  {
    window.clear(Black);
    picasso.drawObjects(window_);
    window.display();
  }

  return 0
}

就像我说的,我的头脑比较混乱,仍处于学习的早期阶段。对任何事情的任何建议或意见表示赞赏。

您的向量只能从 0...size-1 索引。您从 size 开始,因此超出范围,因此调用 未定义的行为 ,因此(因为您实际上很幸运)您的崩溃。

为您的 collection 使用迭代器。如果你想反过来,使用 reverse-iterator.

for (auto it = object_buffer.rbegin(); it != object_buffer.rend(); ++it)
{
    rectangle_.setSize((*it)->get_size());
    rectangle_.setPosition((*it)->get_position());
    rectangle_.setFillColor(sf::Color::White);
    std::cout << (*it)->get_size().x << std::endl;
    window.draw(rectangle_);
}

或类似的东西。

注意:如有疑问,请将 vector/deque operator[i] 用法替换为 obj.at(i) 访问器。后者是 range-checked 并且会在您通过 invalid-ranged 索引时通过断言向您吠叫。

祝你好运。