Пусть следующий код:Возможно ли иметь ошибку сегментации от ссылки?
Foo & foo = getFoo();
foo.attr; // 100% safe access?
Если foo
был указатель, я хотел бы проверить, если это NULL
, однако, потому что это ссылка, такая проверка является ненужным. Я хочу знать, можно ли испортить ссылку на объект таким образом, чтобы сделать его атрибут небезопасным.
Я пробовал некоторые примеры, например, пытаться сделать NULL
объекту Foo
, но я получил ошибки компиляции. Я просто хочу быть уверенным, что вышеуказанный код всегда безопасен и что нет никакой внутренней внутренней черной магии C++
, о которой я должен знать.
Из ответа Бенджамина я мог бы привести пример кода, где я получаю segmentation fault из справки, поэтому он отвечает на мой вопрос. Я вставлю свой код на случай, если кто-то заинтересован в будущем:
#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;
}
Показать 'функцию getFoo', чтобы лучше ответить на ваш вопрос. –
В моей реальной проблеме 'getFoo' имеет сотни строк кода, а возвращаемый объект может быть изменен сотнями потоков ... Итак, нет, невозможно сделать пример' getFoo'. – Kira
@Kira: Обратите внимание, что ваш segfault почти наверняка из выражения 'b = * (B *) NULL;' в функции 'f()'. Не из 'a.getB(). X' в' main'. –