在无效对象上调用成员函数

gra*_*olf 1 c++ visual-c++ c++11

在visual studio中,您可以在已删除的对象上调用函数:

class Foo {
    void bar() {
        ...
    }
};
Run Code Online (Sandbox Code Playgroud)

你可以实际执行以下代码而不会出错:

Foo * foo = new Foo();
delete foo;
foo->bar();
Run Code Online (Sandbox Code Playgroud)

并且只要Foo :: bar中的代码不对this指针执行任何操作.我的第一个问题是,这种未定义的行为是否恰好起作用还是符合标准?

第二个问题:

如果我们将代码更改为:

Foo * foo = new Foo();
delete foo;
foo = nullptr;
foo->bar();
Run Code Online (Sandbox Code Playgroud)

我们可以在Foo :: bar中使用以下检查

if (this == nullptr) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

以确定我们是否对有效对象进行操作.虽然这样做似乎不太好主意,但是有没有任何架构/设计可能有用?

Bau*_*gen 6

两种用途都只是简单的UB.

if (this == nullptr)甚至可能被编译器优化掉,因为在法律代码中this从来没有nullptr.Clang警告说这个顺便说一下.

更新:从gcc 6开始,gcc实际上是根据假设进行优化this != nullptr.他们还添加了警告.现场观看.

  • @PaoloM当然编译器不需要优化它,我只是说它是允许的.Clang警告说这个顺便说一下. (2认同)