此C 代码如何工作?非初始化的指针
How does this C++ code work? Uninitialized Pointer
可能的重复:
当我在空对象指针上调用成员函数时会发生什么?
class A {
public:
void foo() { cout << "Work";}
void bar() { this->foo(); }//new edit, works too!
};
class B {
private:
A *a; //never initialized
public:
A& getA() {
return *a;
}
};
void SomeFunction() {
B *b = new B();
B& bRef = *b;
bRef.getA().bar();//edited
delete b;
}
我在没有初始化" A"的情况下调用了somefunction(),并且它仍然正确打印"工作"。我不明白为什么,它应该以细分故障的方式保释!
这是未定义的行为,但是它对大多数编译器都可以使用,因为foo
不是virtual
,并且不使用this
指针。
请记住,类只是C 的构造。编译时,所有类方法只是接受隐藏的this
参数的静态方法。
鉴于您的foo()
方法永远不会引用任何数据成员,因此它不需要使用它,因此尽管有非直接的价值,因此运行良好。
语义上,
o.f(args)
与
相同f(o, args)
因此,您可以考虑要调用的功能(A::foo()
)等效于:
void A_foo(A* pthis)
{
cout << "Work";
}
您可以看到,pthis
永远不会被删除,因此不会发生无效的内存访问。即使您键入this->foo()
,它也是完全相同的调用,并且this
也不需要被删除。
至少,这是编译器实施它的一种常见方法。确切地说,这是不确定的,因此在死亡站9000上运行代码可能会将小猫带入太空。想想小猫!
相关文章:
- 分段错误 - 读取初始化指针的数组
- 初始化指针的常量向量
- 初始化指针或引用成员变量以指向另一个成员
- C++初始化指针/引用/复制细微差别
- 使用无效指针初始化指针声明符的行为是否未定义?
- 在一行中初始化指针(新uint8_t[高度*宽度*3])
- 如何使用可变模板初始化指针?
- 初始化指针时出现写入访问冲突
- C 错误,带有卷曲括号的字面初始化指针
- 重新初始化指针是一种不好的做法吗?
- 初始化指针?C
- 初始化指针向量的向量
- 如何在类函数中正确初始化指针
- C++初始化指针会使应用程序随机崩溃
- 初始化指针结构 - 内存中的外观
- 如何使用struct构造函数在结构中初始化指针阵列
- 在一行中声明并初始化指针到类实例
- 分配数组与初始化指针
- QT 中的非初始化指针
- 使用地址值初始化指针