访问 nullptr 怎么可能工作
How is possible that accessing nullptr works?
我有一个简单的类:
class B
{
public:
int getData() { return 3; }
};
然后,我用 nullptr 初始化一个指向它的指针:
B *foo{ nullptr };
然后,尝试使用它会带来惊喜:
int t = foo->getData();
而 t 现在是 3。如果不构造类,这怎么可能?是因为getData()不使用"this"吗?这打破了我对指针的所有知识。
这是预期的行为吗?我在Visual Studio 2013工作。
这是预期的行为吗?
不,这是UB,一切皆有可能。
是因为getData()不使用"this"吗?
是的,它可能有效,因为this
不会在特殊情况下使用,但不能保证任何事情。
这是未定义的行为,所以你真的应该非常害怕。
它可能会碰巧显然做了一些事情(在您的C++实现上),因为getData
函数不是虚拟的,并且不使用B
的任何成员。因此,生成的代码不会取消引用空指针。
这是未定义的行为,您正在从nullptr
访问成员方法。不会定义任何特定的行为或结果。
在这种情况下;给定(cpp首选项):
关键字
this
是一个 prvalue 表达式,其值是调用成员函数的对象的地址。
由于 this
的NULL
值没有被取消引用 - 成员方法不是虚拟的,并且不访问this
的任何成员数据 - 它"似乎"有效。
相关文章:
- 头文件可以在主类中运行.这怎么可能?
- 怎么可能只让设备使用 pjsua2 捕获或播放
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- 怎么可能写 f( *this, std::forward<Args>(args)... ) 而 f 只用 F f 声明;
- 在QT C++编辑Qtable模型数据时,我需要得到一个小盒子,我需要显示编辑文本,这怎么可能?
- 在给定相同的输入的情况下,某些代码怎么可能花费更多时间来运行,这似乎只是因为它处于循环中?
- 答案怎么可能是433?
- 八进制文字怎么可能是负数?
- 我们可以在整数类型的双指针中分配2D整数数组的地址吗?怎么可能
- 我怎么可能从尚未定义某些成员方法的类创建实例?(C++)
- 使用 stl 迭代器封装向量是否很好?如果是?怎么可能呢?
- 几个比较怎么可能比一些计算慢
- 我的 Cuda 矢量怎么可能在填充后是空的
- 怎么可能有两个同名的变量——一个是全局变量,另一个是局部变量
- 奇怪的交叉播.这怎么可能
- 一个变量怎么可能既是constexpr又不是constexpr
- 如果方法私有,是否可以从 main 调用该方法?如果不是,怎么可能
- ANSI到Unicode或向后转换:怎么可能?
- std::unique_ptr怎么可能没有大小开销
- 访问 nullptr 怎么可能工作