Giả sử đoạn mã sau:Có thể có lỗi phân đoạn từ tham chiếu không?
Foo & foo = getFoo();
foo.attr; // 100% safe access?
Nếu foo
là một con trỏ, tôi sẽ kiểm tra nếu nó là NULL
, tuy nhiên vì nó là một tài liệu tham khảo, kiểm tra như vậy là hưởng ứng nhiệt liệt. Những gì tôi muốn biết là nếu nó có thể mess up với một tham chiếu của đối tượng như vậy mà nó sẽ làm cho truy cập thuộc tính của nó không an toàn.
Tôi đã thử một số ví dụ như cố gắng truyền NULL
đến một đối tượng Foo
nhưng tôi đã gặp phải lỗi biên dịch. Tôi chỉ muốn chắc chắn rằng đoạn mã trên luôn an toàn, và rằng không thể có một phép màu đen bên trong có thể là C++
mà tôi nên biết.
Từ câu trả lời của Benjamin, tôi có thể tạo mã ví dụ nơi tôi nhận được segmentation fault từ tham chiếu, do đó, nó trả lời câu hỏi của tôi. Tôi sẽ dán mã của tôi chỉ trong trường hợp ai đó quan tâm đến tương lai:
#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;
}
Các 'getFoo' chức năng, để trả lời câu hỏi của bạn tốt hơn. –
Trong vấn đề thực sự của tôi, 'getFoo' có hàng trăm dòng mã, và đối tượng mà nó trả về có thể được sửa đổi bởi hàng trăm chủ đề ... Vì vậy, không, không thể tạo một ví dụ về' getFoo'. – Kira
@Kira: Lưu ý rằng segfault của bạn gần như chắc chắn từ câu lệnh 'b = * (B *) NULL;' trong hàm 'f()'. Không phải từ 'a.getB(). X' trong' main'. –