带继承的未初始化指针对象

时间:2012-07-17 05:16:28

标签: c++ pointers initialization undefined-behavior

我正在使用未初始化的指针对象来访问成员函数。它有效,我知道它是如何工作的。但是当我用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;
}

3 个答案:

答案 0 :(得分:4)

取消引用未初始化的指针是未定义的行为。为什么你认为它不应该崩溃?

答案 1 :(得分:0)

第一次在未初始化的指针或空指针上使用解除引用运算符(->)时,您的代码很可能会产生分段错误。这是未定义的行为。这意味着如果它对你有用,那只是运气,或者说运气不好,因为编译器在寻找错误时会误导你。

使用这样的指针:

A *ptr = new A();
ptr->printml(1);

答案 2 :(得分:0)

当您调用函数后,事情发生了 1)编译器检查对象类型(不是内容)并调用该类型的成员函数。 2)它将此指针(指向对象本身的指针)作为第一个参数传递给成员函数 3)它隐式使用这个指针来调用成员变量。

考虑到以上几点,在你的情况下,当你没有在成员函数中使用成员变量时,不使用这个指针,这就是为什么它不会崩溃,当你使用成员变量时它会崩溃。

仍然将此视为未定义的行为,并且必须在不初始化的情况下使用指针对象。