c++:不删除对象/总是/内存泄漏

C++: Is not deleting an object /always/ a memory leak?

本文关键字:总是 泄漏 内存 对象 删除 c++      更新时间:2023-10-16
class MyClass
{
    // empty class with no base class
};
int main()
{
    MyClass* myClass = new MyClass();
    return 0;
}

这是内存泄漏吗?

是。即使您的类是空的,您仍然会泄漏内存。这有几个原因:

  • 分配永远不会是零长度。您的操作系统不会返回一个零字节的缓冲区。有一个最小分配大小,这是你分配一个零字节结构时得到的大小。(在我的机器上,它是16字节)
  • 即使存在零长度分配,对象也至少有1字节大(其中一个字节的大小与char的大小相同)。
  • 即使您确实获得了零长度分配,您的操作系统也必须跟踪此分配。为此,它使用更多的字节将地址映射到其分配细节。这有一个常量大小的内存开销,你得到每次分配内存。

所以,你的代码泄漏了至少一个字节的内存,加上分配细节,即使你的结构是空的。

任何时候都有内存泄漏

  • 你动态分配一个对象,然后
  • 将丢失所有指向动态分配对象的指针和引用

此时,您无法销毁动态分配的对象,因此该对象被泄漏。

在您的示例程序中,您动态分配MyClass对象并设置myClass指向它。myClass是指向动态分配对象的唯一指针。然后从函数返回并丢失指针;此时,动态分配的MyClass对象泄露了。

这是否重要取决于对象是什么,程序是什么,以及泄漏发生的时间。如果对象在被销毁时不需要做任何清理(例如,如果它的析构函数是微不足道的),那么在程序终止之前没有销毁它通常是糟糕的风格,但相对于其他类型的泄漏来说,并不是特别糟糕。

请注意,所有内容都保证至少是c++字节的大小,其大小始终与char相同。(在不同的系统上,具体情况可能会有所不同,但通常是8位。请与CHAR_BIT核实。)所以,是的,它将占用内存(尽管很少)并且内存将被泄漏。

因此,不删除对象实际上总是会泄漏内存。