[英]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.