相关疑难解决方法(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++来调用不通过空指针访问成员的非静态方法?

我最近遇到了以下代码:

class Foo
{
public:
    void bar();
    // .. other stuff
};

void Foo::bar()
{
    if(!this) {
        // .. do some stuff without accessing any data members
        return;
    }

    // .. do normal actions using data members
}
Run Code Online (Sandbox Code Playgroud)

代码编译是因为在C++方法中只是隐式传递'this'指针的函数,'this'可以像任何其他指针一样被检查为NULL.显然,即使它没有崩溃,这段代码也会让人感到困惑和不好.在调试器中单步调试代码会非常混乱,看到一个NULL指针即将有一个调用它的方法,然后看不到预期的崩溃.我的问题是:它是否违反了C++标准来调用SomeFooPtr->bar()哪里SomeFooPtr == NULL

我发现它可能不是因为用户定义的operator->返回一个指针,这意味着即使该指针为NULL,它肯定没有被解除引用(取消引用一个NULL指针我敢肯定被标准视为非法或未定义).另一方面,原始指针的语义不一定必须与用户定义的指针的语义匹配 - 也许操作符 - 对它们来说被认为是解除引用,即使编译器不会生成一个.

c++ methods null standards pointers

7
推荐指数
2
解决办法
515
查看次数