相关疑难解决方法(0)

何时在null实例上调用成员函数会导致未定义的行为?

请考虑以下代码:

#include <iostream>

struct foo
{
    // (a):
    void bar() { std::cout << "gman was here" << std::endl; }

    // (b):
    void baz() { x = 5; }

    int x;
};

int main()
{
    foo* f = 0;

    f->bar(); // (a)
    f->baz(); // (b)
}
Run Code Online (Sandbox Code Playgroud)

我们期望(b)崩溃,因为x空指针没有相应的成员.在实践中,(a)不会崩溃,因为this从不使用指针.

因为(b)取消引用this指针((*this).x = 5;),并且this为null,程序进入未定义的行为,因为取消引用null总是被称为未定义的行为.

(a)导致未定义的行为吗?如果两个函数(和x)都是静态的呢?

c++ standards-compliance null-pointer undefined-behavior language-lawyer

115
推荐指数
2
解决办法
1万
查看次数

当我在NULL对象指针上调用成员函数时会发生什么?

我接受了以下面试问题:

class A
{
public:
    void fun()
    {
        std::cout << "fun" << std::endl;
    }
};

A* a = NULL;
a->fun();
Run Code Online (Sandbox Code Playgroud)

执行此代码时会发生什么,为什么?


也可以看看:

c++

44
推荐指数
6
解决办法
9450
查看次数

为什么在C++中通过空指针调用方法"工作"?

可能重复:
通过NULL类指针调用类方法

#include <iostream>
using namespace std;
class test
{
    int i;
public:
    test():i(0){ cout << "ctor called" << endl;}
    void show()
    {
        cout<<"show fun called"<<endl;
    }
};

int main(int argc , char *argv[])
{
    test *ptr = NULL;
    ptr->show();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

很明显,没有人会被召唤.这是标准吗?或者只是一些编译器优化,因为这个指针没有在show()成员函数中使用?

c++

8
推荐指数
2
解决办法
9040
查看次数