在 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 输出中存在许多误报。