2

可能重复:
C++:空类的对象的大小是多少?

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

class Empty
{
  doA()
  {
  }
};
4

5 回答 5

2

好吧,即使是空类也必须sizeof大于 0,因此该类仍然会占用空间。原因是唯一的对象应该有唯一的地址。它是否具有成员函数(方法)这一事实无关紧要。

所以这会泄漏:

new Empty; // leaking at least 1 byte
于 2012-11-04T02:47:40.553 回答
1

标准要求每个类实例具有非零大小,甚至是空类。看到这个答案的原因。

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

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

如果一个类具有虚函数,则该类的每个实例都需要存储虚函数表指针。

于 2012-11-04T02:49:44.220 回答
0

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

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

从规范:

最派生类的大小应大于零。

于 2012-11-04T02:45:15.190 回答
0

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

于 2012-11-04T02:49:44.640 回答
0

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

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

如果您根本不使用声明的类,编译器可能会将其优化掉,因此您不会有任何内存泄漏,因为您从未为它分配内存。

于 2012-11-04T02:49:57.103 回答