Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;未处理的异常:向认为无效参数为致命参数的函数传递了无效参数_C++ - Fatal编程技术网

C++ C++;未处理的异常:向认为无效参数为致命参数的函数传递了无效参数

C++ C++;未处理的异常:向认为无效参数为致命参数的函数传递了无效参数,c++,C++,我在学校做一个小组项目,我们正在制作一个2d游戏,我遇到了一个例外,我不知道该怎么办 旁注:所有这些都是在调试模式下完成的 我们有一个physicsengine类,用于计算碰撞并向实体添加矢量力,代码: void PhysicsEngine::doPhysicsTick() { vector<vector<unordered_set<Entity*>>> *grid = this->grid.getGrid(); unordered_se

我在学校做一个小组项目,我们正在制作一个2d游戏,我遇到了一个例外,我不知道该怎么办

旁注:所有这些都是在调试模式下完成的

我们有一个physicsengine类,用于计算碰撞并向实体添加矢量力,代码:

void PhysicsEngine::doPhysicsTick()
{
    vector<vector<unordered_set<Entity*>>> *grid = this->grid.getGrid();
    unordered_set<Entity*>* updatable = new unordered_set<Entity*>();
    unordered_set<Entity*>* collidable = new unordered_set<Entity*>();

    const int &r = CollisionGrid::C_GRID_RADIUS;

    for (int row = 0; row < grid->size(); row++)
    for (int col = 0; col < grid->at(row).size(); col++)
    {
        collidable->clear();

        // put all surrounding grid blocks in a entity list to
        // check against collision with the current block

        int rw(row - r > 0 ? row - r : 0);
        int cl(col - r > 0 ? col - r : 0);

        for (int rrow = rw; rrow <= row + r && rrow < grid->size(); rrow++)
        for (int rcol = cl; rcol <= col + r && rcol < grid->at(rrow).size(); rcol++)
            for (Entity *e : grid->at(rrow).at(rcol)) // It crashes here
                collidable->insert(e);

        for (Entity *e : grid->at(row).at(col))
        {
            if (e->isFixed())
                continue;

            e->speed += gravity;

            eBounds.reBox(e->location, e->getSize() + e->speed);

            for (Entity *c : *collidable)
                if (isOverlapping(eBounds, Box(c, c->getSize())) && e != c)
                    doCollision(e, c);

            updatable->insert(e);
        }
    }

不允许使用Win32 API之外的任何库和一些默认C++库


编辑:我添加了一些图片(并取消了无序_集的动态分配)

它应该显示什么:

有时在第一个勾号上显示的内容: (注意指针是如何相同的,在同一次跑步中的前两次击球)

在第一个刻度上显示的其他时间:


您的程序是否处理任务?因为在这种情况下可能会解决您的问题(此类异常永远不会在正确的时间使程序崩溃!)

如果没有,则需要进一步调试程序。像打印
rrow
rrcol
grid->size()
grid->at(rrow)->size
一样,每次在崩溃行之前

但我的钱在代码的并发/内存管理方面。事实上,它在delete部分的析构函数中崩溃,这让我认为可能您正在处理其他地方已经删除的项目,或者在没有适当措施的情况下同时处理项目。在你的屏幕截图中,你有一堆
size=?
,这可能意味着你的项目/实例被删除了,你的指针指向了空闲内存,导致了在循环中访问它时崩溃。这是一个很难解决的错误


另外,您应该能够在调试器中访问异常的参数,如果可以的话,也许您可以发布它的所有内容?

您动态分配STL容器有什么原因吗?@DavidHaim我希望在堆栈上节省一些空间,尽管我甚至不确定它是否做到了这一点(我们的老师在这个主题上没有给我们太多的信息)您没有保存那么多,因为大多数容器(
std::array
是一个例外)无论如何都要动态分配它们的内容。容器类本身很少超过几个指针。内容不在堆栈上。检查索引。它们几乎肯定是超出范围的。@LightningRacisinObrit但为什么?它们不应该与所有的
isize()一起使用
I'm doingI对此可能不是很清楚,但是,如果我在析构函数中取消对delete的注释并让它运行,则会弹出错误,但它实际上不会中断程序(很高兴继续迭代和滴答)这就是为什么我特别说它只发生在第一个勾号上。而在第一个错误勾号之后发生的一切都是正常的预期行为。很抱歉没有包含for循环,当我看到一个行-列双循环时,我只看到一个循环,这样对我来说更可读。显然你的钱是对的,因为我做了一个
Gameloop g(world)
在某个地方,它就这样消失了,仍然无法解释它为什么会继续运行,但感谢你为我指明了正确的方向!@WhiteNightFury如果它能帮上忙,我在Xbox编程中也遇到了类似的问题,我必须确保对异步API的所有调用都必须有一个
创建任务(call\u ret\u value)。然后(…)
对抛出的任何异常进行try/catch。无论如何,异常的
反汇编
参数应该指向问题,如我的答案中的链接所示。
Gameloop::~Gameloop()
{
    //if( t ) // t = #include <thread>
    //  delete t;
}