C++ 内存似乎无缘无故地没有被释放

C++ memory doesn't get freed for seemingly no reason

我正在使用 Qt 和 OpenGL 开发 3D 编辑器,但似乎无缘无故地遇到了严重的“内存泄漏”。我已将问题隔离到一个 class,看起来像:

template <size_t SIZE>
class GlVoxelChunk {
private:
    gl::FunctionsX *glFuncs; // unmanaged pointer, points to a global variable
    Color data[SIZE * SIZE * SIZE];
    Vec3i pos;
    GLuint glTexture = 0;

    std::vector<GLfloat> vertices;
    std::vector<GLbyte> colors;
    std::vector<GLuint> elements;
    ...
}

// all chunks are stored like this:
std::map<Vec3i, GlVoxelChunk<16>> 

这里的两个大内存消耗是 3D 数组和包含上传到 GL 的数据的向量。

加载大型模型并用它填充这些块时,内存使用量会上升到大约 3GB。当删除模型并因此再次删除这些块时,它不会出现任何问题。我的第一个猜测是这些块永远不会被破坏,但事实并非如此。我:

我什至不自己手动管理任何内存,这些块都存储在 std::map 中。我可以肯定地说这些向量是罪魁祸首,因为当我不填充它们时,删除 3D 对象时内存使用率下降到接近于零。更奇怪的是,如果我填充它们,根本没有 内存被释放,甚至这些 3D 数组也没有被释放。

此时,我不知道该怎么办。如果 Memgrind 甚至无法检测到 3GB 的内存泄漏,它就毫无用处。我还能做什么?

当向量被清除或者当你 delete 你用 new 等分配的东西时,析构函数被调用并且内存被释放并可用于新用途。但是不一定返回到OS。通常编译器运行时库会保留内存,它将用于满足程序的新分配,而不必再次涉及 OS。这加快了未来的分配。