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。当删除模型并因此再次删除这些块时,它不会出现任何问题。我的第一个猜测是这些块永远不会被破坏,但事实并非如此。我:
- 实例对块进行计数,删除模型后计数回落到 0
- 创建了另一个包含实例计数对象的向量,这些对象也都被正确清除了
- 运行 我使用 memgrind 的应用程序检测任何丢失的内存,但没有找到任何东西
- 检查是否使用 gdb 调用了析构函数并且它们都执行了
我什至不自己手动管理任何内存,这些块都存储在 std::map
中。我可以肯定地说这些向量是罪魁祸首,因为当我不填充它们时,删除 3D 对象时内存使用率下降到接近于零。更奇怪的是,如果我填充它们,根本没有 内存被释放,甚至这些 3D 数组也没有被释放。
此时,我不知道该怎么办。如果 Memgrind 甚至无法检测到 3GB 的内存泄漏,它就毫无用处。我还能做什么?
当向量被清除或者当你 delete
你用 new
等分配的东西时,析构函数被调用并且内存被释放并可用于新用途。但是不一定返回到OS。通常编译器运行时库会保留内存,它将用于满足程序的新分配,而不必再次涉及 OS。这加快了未来的分配。
我正在使用 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。当删除模型并因此再次删除这些块时,它不会出现任何问题。我的第一个猜测是这些块永远不会被破坏,但事实并非如此。我:
- 实例对块进行计数,删除模型后计数回落到 0
- 创建了另一个包含实例计数对象的向量,这些对象也都被正确清除了
- 运行 我使用 memgrind 的应用程序检测任何丢失的内存,但没有找到任何东西
- 检查是否使用 gdb 调用了析构函数并且它们都执行了
我什至不自己手动管理任何内存,这些块都存储在 std::map
中。我可以肯定地说这些向量是罪魁祸首,因为当我不填充它们时,删除 3D 对象时内存使用率下降到接近于零。更奇怪的是,如果我填充它们,根本没有 内存被释放,甚至这些 3D 数组也没有被释放。
此时,我不知道该怎么办。如果 Memgrind 甚至无法检测到 3GB 的内存泄漏,它就毫无用处。我还能做什么?
当向量被清除或者当你 delete
你用 new
等分配的东西时,析构函数被调用并且内存被释放并可用于新用途。但是不一定返回到OS。通常编译器运行时库会保留内存,它将用于满足程序的新分配,而不必再次涉及 OS。这加快了未来的分配。