具有继承的未初始化指针对象
Uninitialized pointer object with inheritance
我正在使用一个未初始化的指针对象来访问成员函数。它是有效的,我知道它是如何工作的。但是,当我用B派生那个类并试图访问那个成员函数时,它给出了分段错误。有人能解释一下为什么它表现出两种不同的行为吗?
以下是程序:如果我评论第29行,它是有效的,但没有它就失败了。
#include <iostream>
using namespace std;
class A
{
int no;
public:
void printml(int i)
{
no = i;
cout << "in base: value"<<no;
}
};
class B:public A
{
public:
void printdl()
{
cout << "in derived" ;
}
};
int main()
{
A *ptr;
B *ptr1;
ptr->printml(1);
ptr1->printml(1);
return 0;
}
取消引用未初始化的指针是未定义的行为。为什么你认为它不应该崩溃?
第一次对未初始化的指针或空指针使用解引用运算符(->
)时,您的代码很可能会产生分段错误。这是未定义的行为。这意味着,如果它对你有效,那只是运气,或者更确切地说是坏运气,因为编译器在寻找错误时误导了你。
使用这样的指针:
A *ptr = new A();
ptr->printml(1);
当您调用函数时,会发生以下事情1) 编译器检查对象的类型(而不是内容)并调用该类型的成员函数。2) 它将此指针(指向对象本身的指针)作为第一个参数传递给成员函数3) 它隐式地使用该指针来调用成员变量。
考虑到以上几点,在您的情况下,当您不在成员函数中使用成员变量时,该指针不会被使用,这就是为什么它不会崩溃,而当您使用成员变量后,它会崩溃。
尽管如此,这仍然被认为是未定义的行为,在没有初始化指针对象的情况下,不能使用指针对象
相关文章:
- 分段错误 - 读取初始化指针的数组
- 初始化指针的常量向量
- 初始化指针或引用成员变量以指向另一个成员
- C++初始化指针/引用/复制细微差别
- 使用无效指针初始化指针声明符的行为是否未定义?
- 在一行中初始化指针(新uint8_t[高度*宽度*3])
- 如何使用可变模板初始化指针?
- 初始化指针时出现写入访问冲突
- C 错误,带有卷曲括号的字面初始化指针
- 重新初始化指针是一种不好的做法吗?
- 初始化指针?C
- 初始化指针向量的向量
- 如何在类函数中正确初始化指针
- C++初始化指针会使应用程序随机崩溃
- 初始化指针结构 - 内存中的外观
- 如何使用struct构造函数在结构中初始化指针阵列
- 在一行中声明并初始化指针到类实例
- 分配数组与初始化指针
- QT 中的非初始化指针
- 使用地址值初始化指针