【发布时间】:2012-07-17 00:51:33
【问题描述】:
当使用指向成员运算符 (->*) 的指针时,对象的哪些指针值会调用未定义的行为?
具体来说,如果所讨论的成员函数不访问任何成员并且不是虚拟的,是否存在以下任一错误?
- 空指针
- 指向已删除对象的指针
This question 类似,但讨论的是常规成员函数调用。
用代码来说明:
#include <iostream>
using namespace std;
class Foo {
public:
int member(int a)
{
return a+1;
}
};
typedef int (Foo::*FooMemFn)(int);
int main(int argc, char** argv)
{
FooMemFn funcPtr = &Foo::member;
Foo *fStar = 0;
Foo *fStar2 = new Foo();
delete fStar2;
int a1 = (fStar->*funcPtr)(4); //does this invoke UB?
int a2 = (fStar2->*funcPtr)(5); //what about this?
cout<<"a1: "<<a1<<" a2: "<<a2<<endl;
return 0;
}
关于未定义行为的问题是关于 C++ 标准的问题,因此我正在寻找对 C++ 标准部分的具体参考。
【问题讨论】:
-
任何无效指针都会调用 UB。空指针无效,已删除指针也是如此。未初始化的也是如此。
标签: c++ undefined-behavior standards-compliance pointer-to-member