gpt4 book ai didi

c++ - 进程终止时是否回收了内存?

转载 作者:IT王子 更新时间:2023-10-28 23:35:26 29 4
gpt4 key购买 nike

在我的一个应用程序中,我基本上在 C++ 中分配内存并将其排入队列以在 C# 中释放内存。此释放在后台运行并且是非确定性的,因此在极少数情况下理论上可能会在所有非托管内存被释放之前退出应用程序。

如果是这样,行为(大致非常精简)就像我的程序一样

int main()
{
Foo* = new Foo();
return 0;
}

我现在的问题是

  • 是程序分配但未解除分配的所有内存在程序退出时自动回收,还是在我重新启动之前一直存在的内存泄漏?
  • 如果自动回收,是什么机制负责?

编辑:这仅与 Windows 有关,因为有些人提到这取决于操作系统。

编辑 2:我不是在谈论简单地忽略应用程序中的所有内存泄漏,而是我是否需要确保在应用程序退出之前正确释放所有内存。

编辑 3:这与打开的文件句柄、析构函数和副作用或任何东西无关,这与将被非确定性释放的内存以及在终止前未释放内存的极少数情况有关。

最佳答案

如果你只关心内存,你可能不需要调用delete,因为操作系统会毁掉你的整个virtual address spaceprocess终止。考虑阅读Operating Systems: Three Easy Pieces (可免费下载)以了解有关操作系统的更多信息。

但你想避免memory leak s,所以你最好好好清理一下。在某些操作系统上,您有像 valgrind 这样的工具。帮助检测此类泄漏(因此您不希望它们发出虚假警告)。

另请阅读 RAII .在现实生活中,Foo(或它使用的间接数据)的构造函数(或其他方法)可能会消耗其他资源(数据库连接、打开的文件、屏幕上的窗口、守护进程、远程连接到外部服务或网络服务器、机械臂等...),并且您希望它们被妥善处理。

考虑使用 smart pointers .

数据结构的 active 是整个程序的属性。我建议阅读 GC handbook ,至少要了解 garbage collection 的概念和术语(这可以看作是一种管理资源的方式,而不仅仅是原始内存)。

(实际上,这取决于很多:如果您正在与数百名其他程序员一起编写一百万行代码程序,那么您需要比在编码时更加小心一个单独的小型单源文件程序;如果您编写神经手术机器人,它与桌面应用程序等不同......所以YMMV)

关于c++ - 进程终止时是否回收了内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47394697/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com