我在实验室中看到了这段代码片段,它实际上是在MSVC2008和G中编译的.
void LinkList< class T >::Insert(T n) { if (this == NULL) // some code here }
据我所知,这不能为null,因为如果没有实例化,你不能在c中调用类函数.这是一个有效的代码吗?如果是这样,背后的原因是什么?它有用吗?
解决方法
since you cannot call a class functions in c++ if it wasn’t instantiated
问题是,你可以,但它是leads to undefined behavior.
这样的检查可能应该是一个断言,尽管这些代码不能保证按标准实际工作. (如果这是null,那么您已经处于未定义的行为状态.)
它“有用”的原因是在删除对象后使用对象进行检测,或者从未创建对象:
template <typename T> // I hate this function void safe_delete(T*& pPtr) { delete pPtr; pPtr = 0; } T* p = new T; safe_delete(p); p->foo(); // this is null,and we've entered undefined behavior
在foo中,你可以断言,“嘿,我们搞砸了:/”.
在我看来,这种用途表明设计不好.你不应该有一个可能再次被调用的指针.你用指针做的最后一件事是删除它;如果它在那之后仍然存在,那么改变你的代码就不行了.