假设类A具有常规成员函数和虚拟成员函数,并且我有两个指向同一A对象的指针。假设一个ptr删除了该对象,而另一个指针不知道该对象。如果另一个指针试图调用常规成员函数和虚拟成员函数会发生什么?
我理解不建议在删除对象后使用指针的行为,并强调常规函数与虚函数之间的区别,甚至是静态成员函数。在编译时编译器究竟如何处理常规函数,虚函数甚至静态函数?
谢谢!
答案 0 :(得分:3)
如果你有两个指向同一个对象的指针,而你delete
一个,那么另一个指向dangling pointer。尝试访问之后的任何内容都是未定义的行为。
答案 1 :(得分:2)
大多数编译器使用名为“this”的附加指针参数将成员函数实现为“普通”函数。
所以只要你没有使用this
指向的任何东西 - 这样的成员函数可以工作(但这样的函数可能不应该是成员)。
虚拟函数的实现方式不同 - 在调用函数之前必须通过vtable
访问this
(以确定调用哪一个)。
请记住,这种差异是特定于实现的 - 在已删除对象上调用任何方法是未定义的行为,应该避免。