如果类没有任何数据成员并且只有mehod,它仍然有可能发生内存泄漏。首先,类方法是对类对象的引用,对象在分配时仍需要内存来存储地址。我是对的吗?
class Empty
{
doA()
{
}
};
答案 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)
这将取决于您如何分配对象,在大多数情况下(或所有情况),即使该类为空,如果您使用例如new
或malloc
分配它,类似的方法,如果丢失指针,你将有内存泄漏。但这也取决于实施。
这是因为new
或malloc
都有办法在对象的内存空间附近存储已分配对象的信息。
如果您根本不使用声明的类,编译器可能会对其进行优化,因此您不会因为从未为其分配内存而导致任何内存泄漏。