簡體   English   中英

C++ 未處理異常:無效參數被傳遞給認為無效參數致命的函數

[英]C++ Unhandled exception: An invalid parameter was passed to a function that considers invalid parameters fatal

我在學校做一個小組項目,我們正在創建一個 2d 游戲,但我遇到了一個異常,我不知道該怎么辦。

旁注:所有這些都是在調試模式下完成的。

我們有一個物理引擎類,用於計算碰撞並向實體添加矢量力,代碼:

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);
        }
    }

我們有一個單獨的碰撞網格類來管理我們存儲實體以進行碰撞檢查的網格(因此我們不必檢查所有內容)

當物理引擎的構造函數稱為PhysicsEngine::PhysicsEngine(World *world) : grid(world)時,將創建碰撞PhysicsEngine::PhysicsEngine(World *world) : grid(world)及其底層vector 但是出於某種原因,僅在第一個刻度上,我看到矢量網格指向填充可碰撞的循環內部不存在的東西(尺寸大得離譜等)。

它拋出的錯誤在標題中。 如果我在它周圍放一個 catch 塊,它只會在某些 C++ 庫中的其他地方隨機崩潰(每次都不同的文件)

並且由於某種原因,如果我不評論我放在那里的東西,它會在我們的游戲循環類(物理引擎的一個調用滴答聲)析構函數中崩潰。

Gameloop::~Gameloop()
{
    //if( t ) // t = #include <thread>
    //  delete t;
}

我們不允許使用 Win32 API 之外的任何庫和一些默認的 c++ 庫


編輯:我添加了一些圖片(並取消了 unordered_sets 的動態分配)

它應該顯示什么:

正確的網格

它有時會在第一個刻度上顯示:(注意指針是如何相同的,在同一次運行中進行的前兩次射擊)

在此處輸入圖片說明

它在第一個刻度上顯示的其他時間:

在此處輸入圖片說明

你的程序處理任務嗎? 因為在這種情況下可能會解決您的問題(這些異常永遠不會在正確的時間使程序崩潰!)

如果沒有,那么您需要更多地調試程序。 像打印rrowrrcolgrid->size() grid->at(rrow)->size ,其中它崩潰前行每次。

但我的錢是在代碼的並發/內存管理方面。 它在刪除部分的析構函數中崩潰這一事實讓我覺得您可能正在處理已在其他地方刪除的項目,或者在沒有采取適當措施的情況下同時處理項目。 在你的截圖中你有一堆size=??? 這可能意味着您的項目/實例已被刪除並且您的指針指向可用內存,導致在循環中訪問它時崩潰。 這是一個很難解決的錯誤。

此外,您應該能夠在調試器中訪問異常的參數,如果可以,也許您可​​以發布其所有內容?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM