【发布时间】:2016-07-13 12:54:39
【问题描述】:
让我们考虑以下代码。事实上,这是我使用 gmock 和模拟 void(void) 方法发现的缩小问题。
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base
{
public:
void GetValueAndDelete() { delete this; } //here we crash
};
int main() {
Derived* p = 0;
p->GetValueAndDelete();
}
构建它:
/tools/gcc6.1/bin/g++ --version
g++ (GCC) 6.1.0
优化级别不同于 -O0 并且运行结果会导致分段错误。
是 gcc 错误还是 c++ 代码的问题(是的,是的,我知道它使用副作用,但它可以与其他编译器一起使用,并且也没有优化)
【问题讨论】:
-
你取消引用一个空指针,你期望会发生什么?
-
我相信在任何情况下取消引用空指针都是分段错误的理由;这是未定义的行为。
-
什么?你在一个空指针上调用一个函数,想知道为什么它不起作用?
-
做
delete this的时候要非常小心,基本上和拆你所在的建筑是一样的。如果你小心,碎片不会杀死你,但大多数情况下都是坏事会发生的。 -
"它可以与其他编译器一起使用" 你的意思是它不打印崩溃消息吗?