动态创建对象并将其设置为0

时间:2014-02-14 06:23:20

标签: c++

请考虑以下代码。

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对方法的地址没有任何影响? 你能解释一下发生了什么吗?

3 个答案:

答案 0 :(得分:1)

获取函数&A::function1的地址并打印出来。将其与对象&obj的地址进行比较。

在内存中,对象本身只包含其非静态数据成员,可能还包含一个vtable指针。

实际的方法是代码而不是数据。它们在所有对象之间共享,您无法更改它们。在幕后,类方法只是“特殊”函数,除了程序员指定的参数外,还透明地接受this指针。

如果用零填写内部状态,那说你真的会弄乱一些对象。

答案 1 :(得分:0)

编译器不会将成员方法或静态成员存储为类的实例。

这就是memset对方法地址没有任何影响的原因。

答案 2 :(得分:0)

“实际的方法是代码而不是数据。它们在所有对象之间共享,你不能改变它们。幕后的类方法只是”特殊“的函数,除了程序员指定的参数外,还透明地接受this指针。 。“

以上是正确的,除了你没有尝试访问任何虚函数这样的事实,所以代码工作正常。如果您将任何方法设置为虚拟,则VPTR将被设置为NULL并且可能存在分段错误(或未定义的行为)。

由于 PRAVEEN