【问题标题】:program crashes because of object vector程序因对象向量而崩溃
【发布时间】:2016-07-31 19:29:58
【问题描述】:

我正在制作一个包含对象的全局向量并将其放入命名空间的程序,代码如下:

Character.h

#include <vector>
class Character
{
  //Constructor and variable declaration, etc.
}
class Player: public Character
{
  //Constructor and variable declaration, etc.
}
namespace chr
{
 extern std::vector<Character> characters;
 extern Player player_one;
}

Character.cpp

namespace chr
{
 Player player_one("name");
 std::vector <Character> characters;
}

主要

#include <SFML/Graphics.hpp> //I'm using the SFML libraries
#include "Personaje.h"

 int main()
 {
 Player player_two("name"); //just to test that single object work (they do)
 chr::personajes.push_back(chr::player_one); //HERE'S THE ISSUE
 
  //sample SFML code to check if the rest of the program works
 sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
 sf::CircleShape shape(100.f);
 shape.setFillColor(sf::Color::Green);

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

    }

    window.clear();
    window.draw(shape);
    window.display();
 }

return 0;
}

当我构建此代码时(我正在使用 code::Blocks),它实际上编译时没有错误,但是当我运行它时,控制台一出现(SFML 窗口甚至没有弹出)它就会冻结并出现一条 Windows 通知,通知我我的程序已停止工作。 我知道是 chr 命名空间 上的代码导致了这种情况,因为如果我将其注释掉,程序运行良好,但我不知道这是为什么。 如果有任何帮助,当程序崩溃时,Windows 会打开 Visual Studio 调试器,它会生成以下消息:

在 wtfhappened.exe 中的 0x0044EFA2 处引发异常:0xC0000005:访问冲突读取位置 0xFFFFFFFC。

如果有这个异常的处理程序,程序可以安全地继续。

感谢您的宝贵时间

【问题讨论】:

  • 调试器的用途。如果你认为//Constructor and variable declaration, etc.CharacterPlayer 都与此无关,那么在我们看到该代码 之前我会有所不同。我的疯狂猜测是,您在这些课程中的一个或两个中都违反了Rule of Three。或object slicing 问题。或者两者兼而有之。顺便说一句,std::vector&lt;Character&gt; characters; 与您的 std::vector &lt;Personaje&gt; personajes; 不匹配。
  • Code::Blocks 不是编译器,而是 IDE/编辑器 ...
  • 什么? Windows自动打开VS调试器?全靠自己?再来一次?

标签: c++ vector crash sfml


【解决方案1】:
std::vector <Character> characters;

这是字符的容器。不是玩家。

chr::personajes.push_back(chr::player_one);

这将使用您的播放器,并从中创建一个新角色以放入向量中。 Player 在 Character 上的所有信息都将丢失,并且您很容易出现名为 slicing 的信息。我会猜测并说这不是你想要的。

有多种方法可以处理此问题。开始时没有字符容器,而是字符引用容器(此处以简单的英语意义使用,而不是 C++ 引用)。您可能需要研究智能指针(即std::shared_ptr&lt;&gt;),以使其尽可能轻松。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多