0

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

3 回答 3

4

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

于 2012-07-17T05:18:57.357 回答
0

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

考虑到上述几点,在您的情况下,当您不在成员函数中使用成员变量时,不使用此指针,这就是它不会崩溃的原因,而当您使用成员变量时,它会崩溃。

这仍然被认为是未定义的行为,并且在未初始化的情况下不得使用指针对象。

于 2012-07-17T07:15:57.997 回答
0

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

使用这样的指针:

A *ptr = new A();
ptr->printml(1);
于 2012-07-17T05:25:56.050 回答