今天看到一段奇怪的代码,它的主要流程是这样的:
void set()
{
Test* p = nullptr;
Test *a = new Test;
*p = a;
std::cout << p->getMember() << "\n";
}
第一感觉这代码肯定是有问题的,应该是编译不过至少应该会有warning,但事实证明这段代码可以编译通过,而且也没有warning。(虽然这段代码确实是错误的)
类Test的定义大致如下:
class Test {
public:
Test():member(0){};
Test(const Test* c) : member(c->member){};
int getMember() const
{
return member;
}
private:
int member;
};
*t=a这行代码相当于调用构造函数Test(const Test *t),所以这段代码可以编译通过。 但是运行的话会产生未定义的行为(undefined behavior)。
看来这种情况只能靠经验了。
千万不要解引用空指针,千万不要解引用空指针,千万不要解引用空指针。