- from alpha to omeg a
12. int y=dangling_square(x); // tính bình phương của x rồi gán cho y 13.
13.
14. cout << y << endl; 15. 15.
16. return 0; 17.} 17.}
Mình đã test chương trình trên, kết quả nó vẫn chạy ngon lành, cho kết quả đúng. Thực sự mình cũng không hiểu thế này là thế nào? Về nguyên tắc thì việc trả về tham chiếu tới biến sqr như trong hàm dangling_square ở trên là “không ổn” , nhưng có thể là mấy cái compiler bây giờ nó được tối ưu tinh vi nên nhận biết được "ý định" của chúng ta. Nó issue một cái warning như sau (IDE mình dùng là Dev C++ 4.9.9.2)
[Warning] reference to local variable `sqr' returned
Rõ ràng thằng compiler cũng nhận ra điều gì đó “khơng ổn”. Tại sao nó lại “khơng ổn”? Để ý hàm dangling_square ta thấy biến sqr được khai báo trong hàm, do đó nó là một biến cục bộ (local variable). Nó chỉ “sống” khi hàm dangling_square thực thi. Khi hàm kết thúc nó cũng “die” theo hàm ln. Ở chương trình trên của ta, trước khi chết nó kịp return một cái tham chiếu. Trong hàm main câu lệnh:
C++ Code:
1. int y=dangling_square(x);
sẽ gán giá trị của dangling_square(x) cho y, nhưng giá trị này là một tham chiếu tới một thằng đã "chết", vì vậy ta hồn tồn khơng thể dự đốn được hành vi của chương trình.
Khi nào ta có thể sử dụng tham chiếu mà khơng sợ bị dính tham chiếu treo? Câu trả
lời là tất cả những trường hợp mà biến trả về vẫn “sống” sau khi hàm kết thúc. Ví dụ các biến trả về có phạm vi rộng hơn phạm vi của hàm (như các biến toàn cục), hàm thành viên trả về tham chiếu tới các thành phần dữ liệu. Tuy nhiên chẳng ai làm điều này cả bởi vì nó phá vỡ tính bảo mật của dữ liệu. Thông qua tham chiếu này dữ liệu có thể bị sửa đổi, điều này giống như “đục một cái lỗ qua bức tường private” vậy.