gpt4 book ai didi

c++ - 是否有可能来自引用的段错误?

转载 作者:IT老高 更新时间:2023-10-28 12:58:46 25 4
gpt4 key购买 nike

假设如下代码:

Foo & foo = getFoo();
foo.attr; // 100% safe access?

如果 foo 是一个指针,我会检查它是否为 NULL,但是因为它是一个引用,所以这种检查是不必要的。我想知道的是,是否有可能弄乱对象的引用,从而使访问其属性变得不安全。

我尝试了一些示例,例如尝试将 NULL 强制转换为 Foo 对象,但出现编译错误。我只是想确保上面的代码总是安全的,并且我应该知道没有可能的内部 C++ 黑魔法。

根据本杰明的回答,我可以制作一个示例代码,其中我确实得到了 segmentation fault来自引用,因此它回答了我的问题。我会粘贴我的代码,以防有人对 future 感兴趣:

#include <iostream>
using namespace std;

class B
{
public:
int x;
B() {x = 5;}
};
class A
{
public:
void f()
{
b = *(B*)NULL;
}
B & getB()
{
return b;
}

B b;
};

int main()
{
A a;
a.f();

cout << a.getB().x << endl;
return 0;
}

最佳答案

是的,这是可能的。

Foo& Fr = *(Foo*)nullptr;

从技术上讲,这已经是取消引用该指针的未定义行为。但它很可能不会导致任何可观察到的错误。不过,这可能会:

Fr.attr = 10;

但是,正如 Jonathan Wakely 在评论中指出的那样,您没有理由检查这样的案例。如果函数返回无效引用,则该函数已损坏,需要修复。假设引用有效,您的使用代码不会被破坏。但是,正如 David Schwartz 的回答中提到的那样,在完全合法的代码中,有效的引用可能变为无效(尽管不是 null)。但是你没有办法检查这个。您只需要知道在什么情况下会发生这种情况,然后停止使用该引用。

关于c++ - 是否有可能来自引用的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34402055/

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