我正在寻找一种方法来快速退出使用C ++类在内存中分配了大量结构的C ++。程序正确完成,但在程序中最后的“返回”之后,所有的自动析构程序都会启动。问题是程序通过大量的C ++类结构分配了大约15GB的内存,这个自动破坏过程需要当它走遍所有结构时,大约要再完成一个小时 - 即使我不关心结果。到目前为止,该程序只需1小时即可完成任务。我想回到操作系统,让它正常的批发过程分配删除 - 这是非常快的。我一直在清理阶段通过手动杀死进程来做到这一点 - 但我正在寻找更好的程序解决方案。
我想向操作系统返回成功,但不关心保留任何内存内容。该程序在正常处理过程中执行了大量的动态分配/释放,因此不仅仅是简单的堆管理。
有什么意见吗?
答案 0 :(得分:4)
在标准C ++中,您只有abort(),但这会导致OS返回失败。
在许多平台(Unix,MS Windows)上,您可以使用_exit()退出程序,而无需运行清理和析构函数。
答案 1 :(得分:2)
C ++ 0x std::quick_exit正是你要找的(g ++ - 4.4.5)。
答案 2 :(得分:1)
如果将15 GB内存分配给相当少量的类,则可以覆盖这些类的operator delete。只需将调用传递给标准删除,但设置一个全局标志,如果设置,将调用删除无操作。或者,如果程序的逻辑使得在构建数据结构的正常过程中不删除这些对象,则可以在所有情况下忽略这些类的删除。
答案 3 :(得分:1)
正如Naveen所说,这不是内存释放的问题。我已经用进化算法编写了神经网络模拟,在这种算法中分配和释放大量内存,这绝不是一个主要问题。
答案 4 :(得分:1)
如果你有一个C99编译器,你可以使用_Exit
函数立即结束,而不必调用全局对象析构函数或注册atexit
的任何函数;是否刷新了未写入的缓冲文件数据,关闭了打开的流,或者删除了临时文件是实现定义的(C99§7.20.4.4)。
如果您使用的是Windows,则还可以使用ExitProcess
来达到同样的效果。
但是,正如其他人所说,除非你做了大量的I / O(编写日志文件等),否则你的析构函数真的不需要花费一个小时才能运行。我强烈建议您对程序进行分析,以了解花费的时间。
答案 5 :(得分:1)
可能的策略取决于main
中直接可见的对象数量,通过这些对象可以访问15GB的数据,以及这些对象是主要的还是静态分配的。
如果所有访问15GB数据都是通过main
中的本地对象,那么您只需将return 0;
替换为main
, exit(0);
。
exit
将终止您的应用程序并触发静态分配变量的清理,但不的局部变量。
如果通过少量静态分配的变量访问数据,则可以将它们转换为动态分配内存的指针(或引用)并故意泄漏。