请考虑以下代码。
class A
{
private :
int a;
public :
void function1()
{
cout<<"hello world"<<endl;
}
void function2()
{
cout<<"bye bye world"<<endl;
}
};
int main()
{
A *obj = new A();
memset(obj,0,sizeof(A));
obj->function1();
obj->function2();
delete obj;
return 0;
}
函数调用不应该失败。当我尝试运行此代码时,它运行得非常好。 为什么memset对方法的地址没有任何影响? 你能解释一下发生了什么吗?
答案 0 :(得分:1)
获取函数&A::function1
的地址并打印出来。将其与对象&obj
的地址进行比较。
在内存中,对象本身只包含其非静态数据成员,可能还包含一个vtable指针。
实际的方法是代码而不是数据。它们在所有对象之间共享,您无法更改它们。在幕后,类方法只是“特殊”函数,除了程序员指定的参数外,还透明地接受this指针。
如果用零填写内部状态,那说你真的会弄乱一些对象。
答案 1 :(得分:0)
编译器不会将成员方法或静态成员存储为类的实例。
这就是memset
对方法地址没有任何影响的原因。
答案 2 :(得分:0)
“实际的方法是代码而不是数据。它们在所有对象之间共享,你不能改变它们。幕后的类方法只是”特殊“的函数,除了程序员指定的参数外,还透明地接受this指针。 。“
以上是正确的,除了你没有尝试访问任何虚函数这样的事实,所以代码工作正常。如果您将任何方法设置为虚拟,则VPTR将被设置为NULL并且可能存在分段错误(或未定义的行为)。
由于 PRAVEEN