5

我正在寻找一种方法来快速退出已使用 C++ 类在内存中分配大量结构的 C++。程序正确完成,但在程序的最后“返回”之后,所有的自动析构函数都开始了。问题是程序通过大量 C++ 类结构分配了大约 15GB 的内存,这个自动销毁过程需要当它遍历所有结构时,它本身需要大约 1 小时才能完成——即使我不关心结果。到目前为止,该程序仅用了 1 个小时就完成了任务。我只想返回操作系统并让它执行其正常的批发进程分配删除 - 这非常快。我一直在通过在清理阶段手动终止进程来做到这一点 - 但我正在寻找更好的程序解决方案。

我想成功返回操作系统,但不关心保留任何内存内容。该程序在正常处理过程中确实执行了大量的动态分配/释放,因此它不仅仅是简单的堆管理。

有什么意见吗?

4

6 回答 6

4

在标准 C++ 中,您只有 abort(),但这会使进程返回失败给操作系统。

在许多平台(Unix、MS Windows)上,您可以使用 _exit() 退出程序,而无需运行清理和析构函数。

于 2011-01-22T17:01:04.773 回答
3

如果您的编译器已经支持C++0x std::quick_exit(g++-4.4.5 支持),那么您正在寻找它。

于 2011-01-22T18:38:57.793 回答
1

如果将 15 GB 内存分配给数量相当少的类,则可以覆盖这些类的 operator delete。只需将调用传递给标准删除,但设置一个全局标志,如果设置,将调用删除无操作。或者,如果您的程序逻辑使得这些对象在构建数据结构的正常过程中不会被删除,您可以简单地在所有情况下忽略这些类的删除。

于 2011-01-22T16:55:15.487 回答
1

正如 Naveen 所说,这不是内存释放的问题。我用进化算法编写了神经网络模拟,其中分配和释放大量内存在大小块中,这从来都不是一个主要问题。

于 2011-01-22T16:56:34.823 回答
1

如果您有 C99 编译器,则可以使用该_Exit函数立即结束,而无需调用全局对象析构函数或注册的任何函数atexit;是否刷新未写入的缓冲文件数据、关闭打开的流或删除临时文件是实现定义的(C99 §7.20.4.4)。

如果你在 Windows 上,你也可以使用ExitProcess来达到同样的效果。

但是,正如其他人所说,除非您进行大量 I/O(写入日志文件等),否则您的析构函数实际上不应该花费一个小时来运行。我强烈,强烈建议你分析你的程序,看看时间花在了哪里。

于 2011-01-22T17:05:34.617 回答
1

可能的策略取决于main您访问 15GB 数据时直接可见的对象数量,以及这些对象是本地的还是静态分配的。

如果对 15GB 数据的所有访问都是通过 中的本地对象main,那么您可以简单地将return 0;末尾的main替换为exit(0);
exit将终止您的应用程序并触发清理静态分配的变量,但不会清理局部变量。

如果通过少数静态分配的变量访问数据,您可以将它们转换为动态分配内存的指针(或引用)并故意泄漏。

于 2011-01-22T17:07:25.177 回答