gpt4 book ai didi

c++ - 什么时候抛出段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 12:23:01 25 4
gpt4 key购买 nike

假设我有一个类

class A {
int x;
int y;
public:
getSum1() const {
return getx() + y;
}
getSum2() const {
return y + getx();
}
getx() const {
return x;
}
}

然后我有

int main(int argc, char **argv) {
A *a = 0;
switch(argc) {
case 0:
a->getsum1();
break;
default:
a->getsum2();
break;
}
return 1;
}

这个程序会出现段错误。我注意到在我的机器上,当 getsum1 执行时,核心dump 说段错误是在 getx 中引起的,而当 getsum2 执行时它说错误发生在 getsum2 中。

这是有道理的。我有两个问题:
1. 这种行为是指定的,还是依赖于实现?
最重要的是:
2. 当 a 被取消引用时,核心转储是否可以说段错误发生在 main 中? (即在 a->getsum*)

谢谢。

最佳答案

当你在空指针上调用这些函数时,你得到了 undefined behavior .这真的是所有应该说的;任何事情都可能发生,不要这样做。

它出现段错误的原因是因为没有 A 为 null。试图访问这些成员就是试图访问无效地址。 (这发生在 getxgetSum2 中,因此会出现段错误报告。)

不,它不能说段错误发生在 main 中,因为在 main 中没有访问 null。 (毫无疑问,您仍然在 main 中输入了未定义的行为,但实际上它只是调用了一个将 this 设置为 null 的函数。)您在那些函数中访问了它。实际上,如果一个函数从不使用 this,它就不会因空指针而崩溃。

但是不要。

关于c++ - 什么时候抛出段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3927936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com