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

时间:2015-04-21 10:59:09

标签: c++ pointers static

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

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

因此在主要结束之后和程序运行之前,静态指针将从静态存储中删除。它分配的内存怎么样呢。什么时候删除数组?它会泄漏吗?

5 个答案:

答案 0 :(得分:4)

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

所以是的,您可以说它泄漏了,尽管大多数程序员将泄漏称为持续发生的事情,而不是您知道的一次性分配并且无论如何都要回收。

答案 1 :(得分:2)

一旦你的程序退出,它的虚拟内存也会被撤销,所以在这种情况下没有内存泄漏。

答案 2 :(得分:1)

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

以下链接中的详细答案将清除您的所有神话。

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

答案 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;

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