2012-06-30 37 views
5

Trong khi trả lời this question Tôi thấy hơi bối rối. Chúng ta đều biết rằng điều này hoạt động tốt do ngữ nghĩa sao chép C++:Đối tượng trên heap và tài liệu tham khảo

int *some_obj = new int(42); 
int a_copy = *some_obj; 

delete some_obj; 

printf("The answer is %d\n", a_copy); 

Nhưng còn điều này thì sao?

int *some_obj = new int(42); 
int& a_ref = *some_obj; 

delete some_obj; 

printf("The answer is %d\n", a_ref); 

Truy cập này có bị xóa bộ nhớ không?

Có thể được hỏi nhiều lần trong các hình thức khác nhau, nhưng điều này không thân thiện với Google. Địa ngục, tôi không thể làm cho một danh hiệu phong nha.

Trả lời

4

Vâng, đúng vậy. Vì vậy, đó là không được phép. (Bạn có thể đảm bảo bạn thấy sự khác biệt bằng cách sử dụng một lớp có trình phá hủy làm thay đổi giá trị.)

+0

Bây giờ tôi đã đọc một phần của trang Wikipedia trên đó, nó giải thích rõ ràng trong đoạn cuối của [phần này] (http://en.wikipedia.org/wiki/Reference_ (C% 2B% 2B) #Relationship_to_pointers). Điều gì về việc trả về các tham chiếu đến các thời gian (A là một số lớp ngẫu nhiên) 'A & func() {return A(); } '? – orlp

+0

Điều đó có cùng vấn đề. Bạn đang trả về một tham chiếu đến một đối tượng không còn tồn tại khi người gọi nhận được nó. –

+0

Được rồi, cảm ơn vì đã giải thích. – orlp

1

Chính xác. Ví dụ thứ hai truy cập bộ nhớ phát hành. Thực hiện các tham chiếu là con trỏ. Rất đơn giản. Tham chiếu là một con trỏ không thể thay đổi và nó có ký hiệu khác nhau của toán tử truy cập. Không có sự khác biệt nào khác giữa chúng.

Các vấn đề liên quan