请考虑以下代码。 因此我们有一些main.cpp文件,我们声明了一个静态指针。
int main()
{
static int* array = new int[1000];
}
因此在主要结束之后和程序运行之前,静态指针将从静态存储中删除。它分配的内存怎么样呢。什么时候删除数组?它会泄漏吗?
答案 0 :(得分:4)
当程序结束时,实际的内存将被释放到操作系统,因为程序已经结束,但不是因为你将它释放了。
所以是的,您可以说它泄漏了,尽管大多数程序员将泄漏称为持续发生的事情,而不是您知道的一次性分配并且无论如何都要回收。
答案 1 :(得分:2)
一旦你的程序退出,它的虚拟内存也会被撤销,所以在这种情况下没有内存泄漏。
答案 2 :(得分:1)
不,它不会泄漏。任何现代操作系统都能够处理这种情况,并且会在进程退出后立即恢复内存,但是有一些例外情况,比如 Palm OS ,你必须释放分配的内存。
以下链接中的详细答案将清除您的所有神话。
答案 3 :(得分:1)
应用程序退出后,堆上分配的所有内存都将返回到操作系统(*)(在大多数情况下,虽然我没有听说过OS,但是没有这样做<强>(**)强>)。那么,它是内存泄漏吗?这取决于。
在这种简单的情况下,没有任何伤害,但请考虑以下情况:
class C
{
protected:
//file handles, network connections, database handles
public:
C()
{
//initialize resources
}
~C()
{
//release resources
}
};
static C* globals = new C[10];
就C ++而言,调用new
/ new[]
与使用构造函数的初始化直接相关,而delete
/ delete[]
也意味着调用特定类的析构函数。因此,在这种情况下,C
拥有的资源永远不会被释放 - 是的,globals
占用的内存将被释放,但它们的析构函数将永远不会被调用。它可能有害也可能没有害,但请记住:
关键是,记忆并不总是最重要的部分。有时,不释放更复杂的资源会产生严重后果,这可能导致程序的未定义行为。
(*)这怎么可能?大多数现代操作系统都有不同的“内存管理器”变体。 Userland流程只能看到所谓的 virtual memory ,它与您可能期望的方式与物理内存没有直接关系 - 它本质上映射虚拟地址 ,到计算机内存中的物理地址。程序终止后,它的整个虚拟空间将被释放,并且由它映射的所有地址都可供其他进程使用。
(**)据我所知,DOS,Windows 3.x以及可能MacOS 9及更早版本可能无法正确回收进程终止后分配的所有内存。但这些肯定不再使用了。
答案 4 :(得分:0)
你的问题的答案取决于你对“泄漏”的定义,但我认为最好回答你想要提出的问题:1000 int
的数组是否会被自动销毁,好像我们打电话给delete[] array;
。
答案是否定的。分配有new
或new[]
的所有内容都应使用delete
或delete[]
取消分配。在您的示例中,只有指针本身是静态分配的,而不是它指向的数组。