簡體   English   中英

c++ memory 泄漏發生在我的代碼中?

[英]c++ where memory leak happens in my code?

我正在解決簡單的 BFS 算法

當我提交我的代碼時,我看到 memory 排除消息。

所以我查看了我的代碼,但找不到 memory 泄漏點。

我通過引用調用向量的向量。

#include <iostream>
#include <vector>
#include <queue>

typedef std::vector<std::vector<int>> vii;

bool canMove(std::pair<int, int> &node, std::pair<int, int> &rule, vii &checker, vii &map, int &R, int &C)
{
    int nextR = node.first + rule.first;
    int nextC = node.second + rule.second;

    // wall check
    if (nextR < 0 || nextR >= R || nextC < 0 || nextC >= C)
        return false;
    if (map[nextR][nextC] == 0)
        return false;

    // not visited || already visited but this is more short way => visit
    if (checker[nextR][nextC] > checker[node.first][node.second] + 1 || checker[nextR][nextC] == 0)
        return true;

    return true;
}

int bfs(vii &map, std::vector<std::pair<int, int>> &rules, vii &checker, int &R, int &C, std::pair<int, int> start)
{
    std::queue<std::pair<int, int>> q;

    // land
    checker[start.first][start.second] = 1;
    q.push(start);

    while (!q.empty())
    {
        std::pair<int, int> node = q.front();
        q.pop();

        for (auto &rule : rules)
        {
            if (canMove(node, rule, checker, map, R, C))
            {
                int nextR = node.first + rule.first;
                int nextC = node.second + rule.second;

                // land
                checker[nextR][nextC] = checker[node.first][node.second] + 1;

                // check result
                if (nextR == R - 1)
                    return checker[nextR][nextC] - 1;

                q.push({nextR, nextC});
            }
        }
    }

    return -1;
}

int main()
{
    int R, C, N;
    std::cin >> R >> C;

    // get map
    std::vector<std::vector<int>> map;
    for (int i = 0; i < R; i++)
    {
        std::vector<int> temp(C, 0);
        for (int j = 0; j < C; j++)
        {
            std::cin >> temp[j];
        }

        map.push_back(temp);
    }

    // get rule
    std::cin >> N;
    std::vector<std::pair<int, int>> rules(N, {0, 0});
    for (int i = 0; i < N; i++)
    {
        std::cin >> rules[i].first;
        std::cin >> rules[i].second;
    }

    // make checker
    std::vector<std::vector<int>> checker;
    for (int i = 0; i < R; i++)
    {
        std::vector<int> temp(C, 0);
        checker.push_back(temp);
    }

    // BFS search
    int result = -1;
    for (int i = 0; i < C; i++)
    {
        if (map[0][i] == 1)
        {
            int bfsResult = bfs(map, rules, checker, R, C, {0, i});
            if (bfsResult)
            {
                result = result == -1 ? bfsResult : std::min(result, bfsResult);
            }
        }
    }

    std::cout << result;

    return 0;
}

here 's my code R and C less than 1000 R, C(1 ≤ R, C ≤ 1,000) memory limit is 256MB

integer的向量很少,但我認為它不能高於4MB,因為更高的R * C是10 ^ 6。

memory 泄漏發生在哪里?

====> 詳細

輸入示例

4 5
1 0 1 0 1
0 1 1 0 0
1 1 0 1 0
1 0 1 1 1
8
-2 -1
-2 1
-1 -2
-1 2
1 -2
1 2
2 -1
2 1

測試地點和問題

https://www.acmicpc.net/problem/13903

不幸的是,它使用的是韓語。 對不起

似乎需要更正“canMove” function (或者您可能錯過了一個條件)。 關注最后兩個 return 語句,這兩個條件都返回 true。 因此,它會導致無限循環 IG。

我不確定我的回答是否有幫助,但我認為您需要查看矢量和甲板的容量。 標准庫隊列被實現為一個卡片組。

當你將一個元素推送到vector、deck等時,容量會增加,也許會翻倍。

這可能是 memory 問題的原因。

要控制它,您可以使用shrink_to_fit function 使容量等於容器的大小。

暫無
暫無

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

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