C++如何处理指针上的非虚函数调用?

cod*_*ion 1 c++ pointers function

我已经搜索过但找不到任何结果(我的术语可能已关闭)所以请原谅我,如果以前曾经问过这个问题.我可能使用了错误的搜索关键字.

我理解如何使用vtable来处理指针上的虚函数调用,特别是当"免费使用"漏洞发挥作用时.但是,假设你有一个指向myclass的指针,并且当myfunction未虚拟实现时你调用函数myfunction?根据一点读数,有一个较少的获取,IE而不是获取函数的地址,然后获取函数,然后调用,它是直接获取.

令我困惑的是,如果在使用之前释放了指向myclass的指针,它将如何工作.编辑:上一段不清楚,我试图弄清楚可能会出现什么样的未定义行为.

任何人都可以为我清除这个吗?如果我的问题不清楚,我会澄清......

CodeLion

编辑:

MyClass *myclass;
free(myclass);
myclass->DoSomething();

Declaration of DoSomething()
void DoSomething{...} // NOT virtual void DoSomething
Run Code Online (Sandbox Code Playgroud)

Yak*_*ont 6

简短的回答是未定义的行为.

长期答案基于典型的C++实现.

对于非virtual方法,该方法基本上是一个带有额外参数的函数,该参数被自动传递调用this:通常也使用非典型调用约定,但这并不重要.

因此foo->method()变为Foo::method(foo)有效,传递一个坏(释放)foo就像传递任何其他坏/被释放的参数一样.

依赖于此是一个坏主意,因为如果您使用无效this来调用非virtual方法,编译器可以随意使用.