c++ - 释放内存需要时间吗?

标签 c++ linux memory memory-management

我有一个 C++ 程序,在执行期间,它会分配大约 3-8Gb 的内存来存储哈希表(我使用 tr1/unordered_map)和各种其他数据结构。

但是,在执行结束时,在返回 shell 之前会有很长的停顿。

例如,在我的主要功能的最后

std::cout << "End of execution" << endl;

但是我的程序的执行会是这样的

$ ./program
do stuff...
End of execution
[long pause of maybe 2 min]
$ -- returns to shell

这是预期的行为还是我做错了什么?

我猜程序最后会释放内存。但是,使用大量内存的商业应用程序(例如 Photoshop)在您关闭应用程序时不会出现这种暂停。

请指教:)

编辑:最大的数据结构是一个 unordered_map,以 string 为键,并存储 integerslist .

我在 linux 上使用 g++ -O2,我使用的计算机有 128GB 内存(其中大部分是免费的)。有几个巨大的物体

解决方案:我最终摆脱了哈希表,因为它几乎已满。这解决了我的问题。

最佳答案

如果程序完成时数据结构足够复杂,释放它们实际上可能需要很长时间。

如果您的程序确实必须创建如此复杂的结构(进行一些内存分析以确保),那么可能没有干净的方法

可以通过肮脏的黑客攻击来捷径释放内存 - 至少在那些进程终止时自动释放进程分配的所有内存的操作系统上.

您可以通过直接调用 libc 的 exit(3) 函数或操作系统的 _exit(2) 来实现。但是,我会非常小心验证这不会使某些 C++ 析构函数代码可能正在执行的任何其他(重要)清理工作短路。而这做什么或不做什么是高度依赖于系统的(操作系统、编译器、libc、您使用的 API,...)。

关于c++ - 释放内存需要时间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2572409/

相关文章:

c - 内存泄漏和无效读/写

c++ - cmake opencv for contrib - 配置不完整,发生错误

c++ - 标准中哪里说不允许声明 `auto f()() ->int;`?

c++ - 如何区分AAA :BBB and AAA:BBB:CCC using regular expression?

c++ - 机器类型(C++ 库): i386 vs x86_64

python - 如何设置我正在生成的进程的 umask?

c++ - 嵌套STL结构

linux - 如何找到最大堆栈大小?

javascript - 浏览器在消耗大量内存后创建 Image Blob 的 ObjectURL 时抛出错误

c - 如何告诉 gcc 指针指向的数据总是对齐的?