【发布时间】:2019-10-08 07:48:22
【问题描述】:
class sphere {
int radius;
public:
sphere(int r){
radius = r;
}
void setRadius(int r) {
radius = r;
}
int getRadius() {
return radius;
}
};
int main()
{
sphere *a, *b;
a = new sphere(1);
b = a;
delete b;
cout << a->getRadius() << endl;
return 0;
}
这段代码实际上在控制台上打印出1。根据this post,,半径为 1 的球体应该已被删除。
我的问题是:
为什么它不返回 SegFault?我期待一个 SegFault,因为由于球体被删除,->getRadius 将不再可用于a。
【问题讨论】:
-
未定义的行为没有任何保证,甚至没有段错误。它可能会导致段错误或在另一个编译器、另一台机器上或只是当您再次运行它时完全不同的东西。试图弄清楚为什么未定义的行为会做某事而不是其他事情是没有用的 - 只是避免未定义的行为。
-
崩溃只是未定义行为的一种可能症状,而不是保证结果。
a->getRadius()的调用具有未定义的行为。未定义的行为不会阻止已删除对象仍然存在的外观。 -
FWIW,如果你用谷歌搜索确切的问题标题(添加了“C++”),你会得到许多回答你问题的 stackoverflow 结果。相比之下,stackoverflow 搜索很糟糕,我不推荐它。
-
不需要使用两个指针。
delete不会以任何方式修改其“参数”。 -
尝试创建另一个具有不同值的球体,例如。 G。 7,并将其分配给
b。它很有可能会占用之前已删除的内存。如果是这样(但根本无法保证!),您还将通过a指针看到新设置的值...
标签: c++