C++:是不是删除了一个对象/总是/内存泄漏?

4 c++ memory memory-leaks memory-management class

class MyClass
{
    // empty class with no base class
};

int main()
{
    MyClass* myClass = new MyClass();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是内存泄漏吗?

zne*_*eak 8

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

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

因此,即使您的结构为空,您的代码也会泄漏至少一个字节的内存,以及分配详细信息.


Jam*_*lis 7

您有任何内存泄漏:

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

此时,您无法销毁动态分配的对象,因此对象被泄露.

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

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

  • 你的问题是"不是删除对象总是内存泄漏?" 而答案就是"是的".这种类型无关紧要; `sizeof(T)> 0`对于任何`T`,即使`T`是一个"空"类. (4认同)