今天看到一段奇怪的代码,它的主要流程是这样的:
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)。
看来这种情况只能靠经验了。
千万不要解引用空指针,千万不要解引用空指针,千万不要解引用空指针。