静态分配内存时我们可以有内存泄漏吗?

时间:2012-01-31 10:34:16

标签: memory memory-leaks

当我们动态分配内存然后在使用后不将其释放回操作系统时,就会发生内存泄漏。静态内存分配的情况是什么?

2 个答案:

答案 0 :(得分:1)

进程将在完成后始终返回内存。这实际上是垃圾收集的一种形式,甚至可供C和C ++程序员使用,尽管很多这样的人都是纯粹主义者并且不喜欢使用它,特别是因为它会在内存检查程序中显示为漏洞。

泄漏的“真实”定义是您不再想要使用但仍在消耗的内存,特别是正在不断分配的内存,以便您可能耗尽内存。

如果您有一个静态缓存,并且向它添加项目并且从不删除它们,那么即使您使用垃圾收集语言,内存仍然存在,您最终将耗尽内存(如果您的缓存是“无限制”)被认为是“在使用中”。

如果您的语言是C ++并且您使用这种结构:

Foo& getTheFoo()
{
   static Foo theFoo;
   return theFoo;
}

这是对象的静态分配。当程序退出时它将被清理并将调用其所有析构函数。在依赖破坏顺序的多个地方可能存在这种事情的危险。此外,它可能意味着你得到错误或你的程序可能需要很长时间才能退出(而且我们都知道我们讨厌那些需要花费大量时间关闭的应用程序,当我们只是希望它们退出时)。

因此,许多人更喜欢“泄漏”的应用程序,它只会在上述情况下使用指针。它实际上不是“泄漏”,因为指向的对象可以在您需要时使用,当您的应用程序以“静态分配”的方式退出时,它将被清除。

顺便说一句,为了绕过你的记忆检查器,你总能拥有某种旗帜,因此你有一个物体(是的,静态的)

class FooDestructor
{
   public:
    ~FooDestructor()
    {
       if( usingMemoryChecker() )
         delete &getTheFoo(); // was allocated with new and not as static
    }
};

static FooDestructor fooDestructor;

答案 1 :(得分:0)

取决于您对“内存泄漏”的定义。通常情况下,它是针对您丢失了指向某个内存的所有指针的情况定义的,因此您无法释放它,例如:

void *p = malloc(666);
p = NULL;
// Oh dear, can no longer call free on the memory!

显然,静态分配的内存不会出现这种情况。