在C++中使用指针的简单代码的行为

Sno*_*man 1 c++ pointers

假设我们有以下代码:

sphere * a, * b;
a = new sphere(1.0);
b = a;
b->setRadius(2.0);
delete b;
a->setRadius(4.0);
sphere * c = new sphere(5.0);
b = new sphere(3.0);
cout << a->getRadius() << endl;
Run Code Online (Sandbox Code Playgroud)

结果会是什么:

(a) 4.0
(b) 3.0
(c) A segmentation fault.
(d) Compiler error.
(e) The behavior cannot be predicted.
Run Code Online (Sandbox Code Playgroud)

我不认为你需要看球体类,因为它很明显是什么.现在,当我们设置时b=a,这意味着b指向a.然后我们delete b,这意味着我们删除b指向的东西,这意味着a现在不再指向任何东西了.所以,当我们试着说a->setRadius,我们不能.所以我认为那是一个seg fault.我是以正确的方式看待这个吗?

Fre*_*son 14

这是未定义的行为.它可能是段错误,或者它可能会产生一窝小猫.任何(以及任何数量的其他可能性)都是符合行为的.一个非常可能的结果是,它会在以后产生令人困惑的后果,从而无声地破坏你的堆.

  • 换句话说,如果你很幸运,它将会出现段错误.如果你运气不好,它会在你将它发布到生产后的6个月内打印出来. (3认同)