Memory 静态分配内存时会出现内存泄漏吗?

Memory 静态分配内存时会出现内存泄漏吗?,memory,memory-leaks,Memory,Memory Leaks,当我们动态分配内存,然后在消耗内存后不将其释放回操作系统时,就会发生内存泄漏。静态内存分配是什么情况?取决于您对“内存泄漏”的定义。通常情况下,它是针对以下情况定义的:您丢失了指向某个内存的所有指针,因此无法释放它,例如: void *p = malloc(666); p = NULL; // Oh dear, can no longer call free on the memory! 显然,静态分配的内存不会出现这种情况。进程完成后将始终返回内存。这实际上是一种垃圾收集的形式,即使C和C+

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

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

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

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

进程完成后将始终返回内存。这实际上是一种垃圾收集的形式,即使C和C++程序员也可以使用,尽管很多人是纯粹主义者,不喜欢使用它,特别是它会出现在内存检查程序中的漏洞。 泄漏的“真实”定义是您不想再使用但仍在消耗的内存,特别是不断分配的内存,可能会耗尽内存

如果您有一个静态缓存,并且您向其中添加了项,但从未删除它们,那么即使您使用的是垃圾收集语言,因为内存仍被视为“正在使用”,最终也会耗尽内存(如果您的缓存是“无限制的”)

如果你的语言是C++,你使用这种结构:

Foo& getTheFoo()
{
   static Foo theFoo;
   return theFoo;
}
这是对象的静态分配。当程序退出时,它将被清除,并将调用其所有析构函数。在你依赖于破坏顺序的多个地方做这种事情可能会有危险。此外,这可能意味着你会出错,或者你的程序可能需要很长时间才能退出(我们都知道,当我们只想让它们退出时,我们多么讨厌那些需要大量时间才能关闭的应用程序)

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

顺便说一下,为了绕过内存检查器,您可以始终使用某种标志,这样您就有了一个对象(是的,一个静态对象)


在上面的例子中,当我们使用C++中的新KyWord时是否出现了同样的情况?如果静态分配的内存没有被释放,还会发生什么?@ Max Out:对静态分配的内存释放意味着什么?假设我声明了一个大小为5个值的int数组(int数组(5))。我一直在这里分配内存。这里是否会出现内存泄漏?@保罗R可能是C++、C++或java。
class FooDestructor
{
   public:
    ~FooDestructor()
    {
       if( usingMemoryChecker() )
         delete &getTheFoo(); // was allocated with new and not as static
    }
};

static FooDestructor fooDestructor;