-2

嗨,我为比赛开发游戏已经有几个星期了。(我对编码有点熟悉,但不是很多)。

我正在用 Visual C++ 编写游戏。当我在 Visual c++ 上以发布模式运行它时,它运行正常,但是当我从 .exe 尝试时,会弹出一个窗口并说“ * *.exe 已停止工作”。我知道错误是什么,但我不知道如何解决它。弹出错误是因为有很多向量,如果我从游戏运行的程序中删除一些调整大小的向量,它可以是任何东西,一堵墙,一个盒子向量,没关系。但是我觉得这很奇怪,因为当我在任务管理器中查看时,游戏只占用了 20,000K 内存。

所以总而言之,如果我从游戏中删除一些向量,游戏 exe 就会运行,如果没有,它只会在 Visual C++ 中运行。我该怎么办?我真的迷路了。

///////////////////////////////////////// ////////////////////////////

好的,如果我只调整四个向量列表的大小,.exe 会运行,但如果我调整大小超过 4 个,exe 会出错,但可视化 c++ 实例仍然运行。

class Level
{

public:

    int LevelWidth;
    MapElements::Background Background;

    //OBJETS SUR MAP
    Array<MapElements::Ground> Grounds;
    Array<MapElements::Wall> Walls;
    Array<MapElements::Platform> Platforms;
    Array<MapElements::Box> Boxs;

    //ENNEMIS et JOUEUR
    Array<Gameplay::Droite> Droites;
    Array<Gameplay::Cercle> Cercles;
    Gameplay::Player Player;
};

这有效:

 void Level::InitializeMap(int MaxGround, int MaxWall, int MaxPlatforms, int MaxBox)
 {
     Grounds.Element.resize(MaxGround);
     Walls.Element.resize(MaxWall);
     Platforms.Element.resize(MaxPlatforms);
     Boxs.Element.resize(MaxBox);
 }

这不会:

 void Level::InitializeMap(int MaxGround, int MaxWall, int MaxPlatforms, int MaxBox, int      MaxCercles)
{
    Grounds.Element.resize(MaxGround);
    Walls.Element.resize(MaxWall);
    Platforms.Element.resize(MaxPlatforms);
    Boxs.Element.resize(MaxBox);
    Cercles.Element.resize(MaxCercles);
}

数组类:

template <typename T> class Array
{
public:
    std::vector<T> Element;
    Array();

};
template <typename T> Array<T>::Array()
{
}

如果我只有 4 个 vector.resize(),则调整大小有效,它可以是任何变量(墙、框等),错误的根源是什么?

4

3 回答 3

2

您对导致该错误的原因是错误的。在窗户上*.exe has stopped working。通常意味着您的应用程序有分段错误

这可能是由任何超出内存边界的读取或写入引起的,这通常意味着您在某处搞砸了free()/ deletemalloc()/new或 a NULL,但是有更多代码,或者没有进一步的解释,我无法进一步诊断。

于 2012-07-28T02:23:41.443 回答
0

当你在 vc 中运行你的游戏时,如果你没有改变它,工作目录默认为项目目录。

当你从 .exe 运行它时,工作目录就是 .exe 所在的目录。

因此,也许您可​​以检查您的游戏是否依赖于直接运行时无法正确定位的内容。

于 2012-07-28T02:16:58.783 回答
0

您从根本上错误地使用了 Vector。您会立即将它们调整到最大可能的大小,而不是让它们相应地调整大小。您可能正在耗尽所有可用内存。

这样做可能会更好:

class Level
{

public:

    int LevelWidth;
    MapElements::Background Background;

    //OBJETS SUR MAP
    MapElements::Ground Grounds[MAXGROUNDS];
    MapElements::Wall Walls[MAXWALLS];
    MapElements::Platform Platforms[MAXPLATFORMS];
    MapElements::Box Boxs[MAXBOXES];

    //ENNEMIS et JOUEUR
    Array<Gameplay::Droite> Droites;
    Array<Gameplay::Cercle> Cercles;
    Gameplay::Player Player;
};

并依靠Level的分配来初始化你的关卡内存。

现在。我不知道 MaxCercles 是什么。但是您需要确保您没有使用太多内存(也就是说,如果它们都是 MAXINTS,您会遇到一些麻烦,具体取决于每个类的大小)。

如果您要使用向量,只需将它们设置为默认的中间尺寸(例如 100 或其他值),然后让它们根据您添加的内容自行调整大小。

于 2013-03-13T23:51:53.593 回答