在 C++ 中使用二维向量时出现明显的内存泄漏
Apparent memory leak while using 2D vector in C++
我决定在一个应用程序中使用 C++ 二维向量。在测试一些代码时,我遇到了 bad alloc
错误。我读到这可能是由内存不足引起的,所以我通过在 gdb 的不同步骤调用 malloc_stats
函数来调查程序的内存使用情况。
虽然我不确定我是否完全理解该函数的输出,但它似乎表明存在内存泄漏。
我试图在下面的简短代码中总结问题:
#include <vector>
#include <iostream>
using namespace std;
vector<vector<double>> get_predictions(){
vector<vector<double>> predictions;
for(int i = 0; i < 10; i++){
vector<double> new_state;
new_state.push_back(600);
new_state.push_back(450);
new_state.push_back(100);
new_state.push_back(200);
predictions.push_back(new_state);
}
return predictions;
}
int main()
{
cout << "start" << endl;
// time loop
for(int i = 0; i < 10; i++){
auto predictions = get_predictions();
// code that uses the latest predictions
}
cout << "end" << endl;
return 0;
}
现在,如果我在 "start" 行调用 malloc_stats()
,输出类似于:
Arena 0:
system bytes = 135168
in use bytes = 74352
Total (incl. mmap):
system bytes = 135168
in use bytes = 74352
max mmap regions = 0
max mmap bytes = 0
在"end"步,函数给出:
Arena 0:
system bytes = 135168
in use bytes = 75568
Total (incl. mmap):
system bytes = 135168
in use bytes = 75568
max mmap regions = 0
max mmap bytes = 0
"In use bytes"字段明显增加
这是否真的意味着保留了更多分配的内存?
如果是,为什么?一旦不同的向量超出范围,分配的内容不应该被释放吗?
那么,如何避免这样的内存问题呢?
非常感谢
由于评论中的建议,我放弃了 malloc_stats,它似乎不像我预期的那样运行,并在我的代码上试用了 Valgrind。
Valgrind 确认上面的玩具示例中没有泄漏。
关于我的主要应用程序,它是 ARM 上的程序 运行。由于我不知道的原因,基本的 Valgrind 实现 via apt install valgrind
没有输出与内存泄漏有关的行。我不得不从 Valgrind 网站上可用的资源重新编译它。问题必须来自特定于体系结构的特殊性?
附带说明一下,我的应用程序还使用 CUDA 代码,这意味着 Valgrind 输出中存在许多误报。
我决定在一个应用程序中使用 C++ 二维向量。在测试一些代码时,我遇到了 bad alloc
错误。我读到这可能是由内存不足引起的,所以我通过在 gdb 的不同步骤调用 malloc_stats
函数来调查程序的内存使用情况。
虽然我不确定我是否完全理解该函数的输出,但它似乎表明存在内存泄漏。
我试图在下面的简短代码中总结问题:
#include <vector>
#include <iostream>
using namespace std;
vector<vector<double>> get_predictions(){
vector<vector<double>> predictions;
for(int i = 0; i < 10; i++){
vector<double> new_state;
new_state.push_back(600);
new_state.push_back(450);
new_state.push_back(100);
new_state.push_back(200);
predictions.push_back(new_state);
}
return predictions;
}
int main()
{
cout << "start" << endl;
// time loop
for(int i = 0; i < 10; i++){
auto predictions = get_predictions();
// code that uses the latest predictions
}
cout << "end" << endl;
return 0;
}
现在,如果我在 "start" 行调用 malloc_stats()
,输出类似于:
Arena 0:
system bytes = 135168
in use bytes = 74352
Total (incl. mmap):
system bytes = 135168
in use bytes = 74352
max mmap regions = 0
max mmap bytes = 0
在"end"步,函数给出:
Arena 0:
system bytes = 135168
in use bytes = 75568
Total (incl. mmap):
system bytes = 135168
in use bytes = 75568
max mmap regions = 0
max mmap bytes = 0
"In use bytes"字段明显增加
这是否真的意味着保留了更多分配的内存?
如果是,为什么?一旦不同的向量超出范围,分配的内容不应该被释放吗?
那么,如何避免这样的内存问题呢?
非常感谢
由于评论中的建议,我放弃了 malloc_stats,它似乎不像我预期的那样运行,并在我的代码上试用了 Valgrind。
Valgrind 确认上面的玩具示例中没有泄漏。
关于我的主要应用程序,它是 ARM 上的程序 运行。由于我不知道的原因,基本的 Valgrind 实现 via apt install valgrind
没有输出与内存泄漏有关的行。我不得不从 Valgrind 网站上可用的资源重新编译它。问题必须来自特定于体系结构的特殊性?
附带说明一下,我的应用程序还使用 CUDA 代码,这意味着 Valgrind 输出中存在许多误报。