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

时间:2011-07-24 03:58:29

标签: c++ class memory memory-management memory-leaks

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

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

    return 0;
}

这是内存泄漏吗?

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:7)

任何时候都有内存泄漏:

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

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

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

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

答案 2 :(得分:1)

请注意,保证一切都至少是C ++字节的大小,C ++字节的大小始终与char相同。 (您的里程数可能会因异国情调的系统而异,但通常为8位。请查看CHAR_BIT。)所以,是的,会占用内存(尽管很少)和记忆将被泄露。

因此,不删除对象确实会泄漏内存。