解引用指向类成员函数的NULL指针
Dereferncing NULL pointer to member function of class
我很好奇这个程序是如何打印类的func()语句的
#include <iostream>
using namespace std;
class foo
{
public:
void func ()
{
cout << "In func" << endl;
}
private:
int a;
};
int main () {
foo *f1 = NULL;
f1->func();
}
编译器版本:g++ (Ubuntu/Linaro 4.4.7-1ubuntu2版权所有自由软件基金会,Inc.
我是如何能够得到方法func()的打印?
对空指针解引用会产生未定义行为。
我可以猜到为什么这仍然适用于你(但再次它是UB!),但如果你试图访问func()
中的成员变量,我很确定它会停止工作。
解除对NULL
指针的引用意味着您有未定义的行为。
然而,在这种情况下,在大多数实现中,您将最终在正确的函数中使用this
为NULL
,调用非虚方法的正常实现是将隐藏参数this
设置为指向对象的指针(在这种情况下为NULL
),然后只是调用函数。如果你不访问成员变量或调用虚方法,你应该在大多数实现中很好。
由于您不能访问成员或调用虚函数或以任何其他方式使用this
指针做任何有用的事情,因此您非常接近static
方法的场景,如果不使用this
指针,我建议使用它。
如果你只想用this
指针检查NULL
是否正确,那么你仍然可以使用static
方法并显式地将指针传递给对象:
static void func(foo* diz) {
cout << "In func" << endl;
if( diz != NULL ) {
diz->actual_work_on_diz();
}
}
相关文章:
- 当使用通配符和null指针调用函数时,对输出的说明
- 为什么返回 NULL 不会破坏函数?
- 构造函数中的 QQuickItem 父项 null
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- C++不重载时间函数,所以我们不需要写 NULL 有什么原因吗?
- 指针永远不会在链表深层复制构造函数中达到 null
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 当传递NULL作为参数时,函数重载是如何工作的
- 从模板化函数返回Null对象
- Windows 函数"GetCursorInfo"返回成功,但光标的句柄为 NULL
- 在构造函数处将类对象强制转换为接口始终返回 NULL
- std::string 的 c_str() 函数如何返回以 null 结尾的字符串?
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- 具有 4 个指针的节点的递归插入函数返回 null
- 我可以为向量函数返回 NULL<double> 吗?
- JNI C FindClass函数返回null
- HBITMAP HBM = loadImage函数返回null
- unique_ptr具有右值删除器的构造函数返回 null
- 如何在默认构造函数中将 char 数组初始化为 null