删除对象时常规函数和虚函数的行为

时间:2015-07-08 14:51:16

标签: c++ class virtual

假设类A具有常规成员函数和虚拟成员函数,并且我有两个指向同一A对象的指针。假设一个ptr删除了该对象,而另一个指针不知道该对象。如果另一个指针试图调用常规成员函数和虚拟成员函数会发生什么?

我理解不建议在删除对象后使用指针的行为,并强调常规函数与虚函数之间的区别,甚至是静态成员函数。在编译时编译器究竟如何处理常规函数,虚函数甚至静态函数?

谢谢!

2 个答案:

答案 0 :(得分:3)

如果你有两个指向同一个对象的指针,而你delete一个,那么另一个指向dangling pointer。尝试访问之后的任何内容都是未定义的行为。

答案 1 :(得分:2)

大多数编译器使用名为“this”的附加指针参数将成员函数实现为“普通”函数。

所以只要你没有使用this指向的任何东西 - 这样的成员函数可以工作(但这样的函数可能不应该是成员)。

虚拟函数的实现方式不同 - 在调用函数之前必须通过vtable访问this(以确定调用哪一个)。

请记住,这种差异是特定于实现的 - 在已删除对象上调用任何方法是未定义的行为,应该避免。