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



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

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

class Empty
{
doA()
{
}
};

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

所以这会泄漏:

new Empty; // leaking at least 1 byte

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

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

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

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

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

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

从规格:

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

内存中的任何对象都需要"空间"。即使是像这样的空类也会自动将构造函数和复制构造函数放入其中。所有这些都需要内存。忘记delete该内存将导致正好sizeof(Empty)字节的内存泄漏。无论是 1 个字节还是几个字节都没有关系。

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

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

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

最新更新