我正在学习一些COM代码,以下代码使我感到困惑。
STDMETHODIMP _(ULONG) ComCar::Release()
{
if(--m_refCount==0)
{
delete this; // how could this "suicide" deletion be possible?
return 0;
}
return m_refCount;
}
是。这是来自here的类似代码。我在那里询问如何使用memeber方法删除其所属对象。现在我在考虑这两种情况。
1-如果我定义一个类而不创建它的实例。在运行时是否存在与此类型相关的任何数据?
2-如果我只创建了1个类的实例,并通过上面的代码使单个对象自杀。删除对象后,对象的方法可以保留在哪里?或者我是否过分关注封装错觉?
我想知道类方法是否首先被名称化,然后存储在程序的代码/文本段中,而不考虑是否存在任何类型的对象。所以只要你定义类方法就存在类方法。
答案 0 :(得分:2)
1-如果我定义一个类而不创建它的实例。这种类型会在运行时存在吗?
编辑OP的编辑和gnud的评论:
类是用户定义的类型。即使您不在代码中使用任何浮点数,该类型也将是float
类型。类型信息将存在。特别是当gnud指出,如果这是一个抽象基类,你将无法创建该类型的任何对象但是具有派生类对象。基类的成员信息将被适当地复制/更新到派生类对象(前提是你定义了适当的ctors)。
2-如果我只做1个实例 类和制作非常单一的对象 通过上面的代码自杀。 删除对象后,在哪里 该方法可以保留吗?
方法是可执行代码的一部分。类对象具有所有成员函数指针的表。创建对象以指向二进制文件的适当区域时,将更新此表。删除对象后,二进制文件仍然存在,无法访问它。
修改:delete this
上的更多内容非常合法:这是常见问题16.15。此外,请注意,这仅在极少数情况下有用 - 引用计数对象就是这样(如您在代码中显示的那样)。
答案 1 :(得分:2)
成员函数的代码与类相关联,而不与类的实例相关联。无论创建了多少个实例(零,一,一百万,等等),都有一个代码副本。执行delete this;
会破坏一个实例,但它对该类的代码完全没有任何作用。成员职能。
1:this
指针仅存在于非静态成员函数中,因此除非代码是此类函数的一部分,否则代码将无法编译。它必须在实例上调用。如果程序中没有任何东西可以创建类的实例,则没有任何东西可以调用该函数,但该函数的代码仍然存在于运行时;它只是没有被执行。
2:正如您所猜测的,类方法存储在程序的文本段中,而不是其数据段中。它们一直存在于程序的整个生命周期中。 (实际上,文本段通常是只读的,不能在运行时修改。)