没有任何数据成员的类会导致内存泄漏吗?

时间:2012-11-04 02:40:40

标签: c++

  

可能重复:
  C++: What is the size of an object of an empty class?

如果类没有任何数据成员并且只有mehod,它仍然有可能发生内存泄漏。首先,类方法是对类对象的引用,对象在分配时仍需要内存来存储地址。我是对的吗?

class Empty
{
  doA()
  {
  }
};

5 个答案:

答案 0 :(得分:2)

嗯,即使是空类也需要sizeof大于0,所以类仍然会占用空间。原因是因为唯一对象应该具有唯一的地址。它具有成员函数(方法)的事实是无关紧要的。

所以这会泄漏:

new Empty; // leaking at least 1 byte

答案 1 :(得分:1)

标准要求每个类实例具有非零大小,甚至是空类。请参阅此answer了解原因。

标准不要求以下内容,但适用于我使用的每个编译器(Visual C ++,GCC,Clang):

实例不会将地址存储到成员函数。编译器已经在编译/链接时知道每个成员函数的地址。因此,一个包含100个成员函数且只有一个float数据成员的类只占用sizeof(float)个字节的空间。

如果一个类有虚函数,那么该类的每个实例都需要存储一个virtual function table指针。

答案 2 :(得分:0)

  

如果类没有任何数据成员并且只有mehod,它仍然有可能发生内存泄漏。

是的,您仍然可以泄漏该类型的内存。您可以泄露任何类型,甚至是无成员的类型。 sizeof(EmptyClass)永远不会等于0.请参阅:http://www.stroustrup.com/#sizeof-empty

来自规范:

  

派生程度最高的类的大小应大于零。

答案 3 :(得分:0)

内存中的任何对象都需要“空格”。即使像这样的空类也会自动将Constructor和CopyConstructor抛入其中。所有这些都需要记忆。并且忘记delete该内存将导致内存泄漏sizeof(Empty)个字节。它是1byte还是几个并不重要。

答案 4 :(得分:0)

这将取决于您如何分配对象,在大多数情况下(或所有情况),即使该类为空,如果您使用例如newmalloc分配它,类似的方法,如果丢失指针,你将有内存泄漏。但这也取决于实施。

这是因为newmalloc都有办法在对象的内存空间附近存储已分配对象的信息。

如果您根本不使用声明的类,编译器可能会对其进行优化,因此您不会因为从未为其分配内存而导致任何内存泄漏。