静态指针和其他奇怪的东西

static pointers and other curious stuff

本文关键字:指针 其他 静态      更新时间:2023-10-16

请考虑以下代码。因此,我们有一些main.cpp文件,并声明了一个静态指针。

int main()
{
static int* array = new int[1000];
}

因此,在main结束之后,在程序结束运行之前,静态指针将从静态存储中删除。那么它分配的内存呢。何时删除阵列?它会泄漏吗?

当程序结束时,实际内存将释放给操作系统,因为程序结束了,但不是因为你释放了它。

所以,是的,你可以说它是泄漏的,尽管大多数程序员将泄漏称为持续发生的事情,而不是你意识到的一次性分配,无论如何都会被回收。

一旦程序退出,它的虚拟内存也会被吊销,因此在这种情况下不会发生内存泄漏。

不,它不会泄漏。任何现代操作系统都能够处理这种情况,并且会在进程退出时立即取回内存,但也有一些例外,如Palm OS,您必须释放分配的内存。

下面链接中的详细答案将澄清您的所有误解。

https://stackoverflow.com/a/654766/2959769

应用程序退出后,堆上分配的所有内存都会返回到操作系统(*)(在大多数情况下,虽然我没有听说过操作系统,但这并不能实现。那么,这是内存泄漏吗?这取决于情况。

在这种简单的情况下,没有危害,但考虑以下情况:

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进程只看到所谓的虚拟内存,它在某种程度上与物理内存没有直接关系,这可能是你所期望的——它本质上将虚拟地址映射到计算机内存中的物理地址。程序终止后,它的整个虚拟空间被释放,所有由它映射的地址都可以用于其他进程。

(**)据我所知,DOS、Windows 3.x以及可能的MacOS 9及更早版本可能无法在进程终止后正确回收所有由进程分配的内存。但这些肯定不再使用了。

您的问题的答案取决于您对"泄漏"的定义,但我认为最好回答您想要问的问题:1000个int的数组会自动销毁吗,就像我们调用了delete[] array;一样。

答案是否定的。分配给newnew[]的所有内容都应与deletedelete[]解除分配。在您的示例中,只有指针本身是静态分配的,而不是它所指向的数组