将指针设置为 null 后通过指针访问函数
Accessing a function through a pointer after setting the pointer to null
我不明白下面的代码段如何产生给定的输出。
#include <iostream>
using namespace std;
class MyClass
{
public:
void doSomething()
{
cout<<"Inside doSomething"<<endl;
}
};
int main()
{
MyClass obj;
MyClass *ptr=&obj;
ptr->doSomething();
ptr=NULL;
ptr->doSomething();
}
输出
内幕做某事
内幕做某事
我执行了一个带有空指针的函数,它实际上调用了该函数。使用 ptr 的 cout 检索存储在 ptr 中的地址显示,在语句 ptr=NULL; 之后,ptr 设置为 0。但它仍然调用doSomething()。里面到底发生了什么?
这是未定义的行为,绝对可能发生任何事情,包括看起来有效。这不可靠!!
在这种情况下,它不会崩溃,仅仅是因为 MyClass::doSomething()
函数没有对其this
指针执行任何操作(这将是NULL
,因此可能会导致崩溃)。
如果您给了MyClass
一个成员,并尝试在doSomething()
中访问它,我希望看到崩溃(段错误):
class MyClass
{
int someNum;
public:
void doSomething()
{
cout<< "Inside doSomething: " << this->someNum <<endl;
}
};
(在我在 Linux 上使用 gcc 4.9.2. 的测试中,我确实看到了段错误。
另外,请重新考虑您使用不良做法using namespace std;
和endl
。
原因是您只访问始终存在的类的代码段。
但是,当您尝试从函数内部访问任何成员变量时,您很可能会崩溃。
所以,每个函数都有一个隐藏的这个指针传递,所以删除对象后这个指针是无效的。因此,删除对象后,对此指针的任何访问都将崩溃。
以下是内部正在发生的事情的简化版本:
doSomething(MyClass * this)
{
// Will work OK if 'this' pointer is NULL, but NOT used.
// Will Crash if 'this' pointer is used.
this->data = 100;
}
相关文章:
- 通过指向指针数组的指针访问子类的属性
- 使用指针访问数组中的对象数据成员
- 无法通过指针访问对象的成员
- decltype:使用指针访问类的静态成员
- 是否可以使用指针访问变量以避免直接编辑变量?
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 使用指针访问数组元素时出现意外结果
- 使用指针访问数组的值
- C++继承从基类指针访问派生类中的非虚拟函数
- 如何使用指针访问成对向量的元素
- 为什么有些库提供无指针访问,而另一些库则不提供
- 如何通过引用或指针访问二维矢量
- 使用指针访问参数接收的结构中的元素时内存泄漏
- 我正在学习C++,我不能使用指针访问参考吗?(举个例子)
- 复制堆栈上的成员值或使用指针访问它?
- C++娜娜 如何从全局列表框*指针访问列表框内的索引 0 上的按钮?
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 从指针访问 Kaguya Lua 状态
- 说明通过指针访问非静态类成员函数
- 有没有办法使用初始化到第一行的指针访问 2d 数组的第二行?