2010-05-25 70 views
10

Giả sử tôi có một ++ lớp C với một thuộc tính đó là một tài liệu tham khảo:Thuộc tính tham chiếu có bị hủy khi lớp bị hủy trong C++ không?

class ClassB { 
    ClassA &ref; 
public: 
    ClassB(ClassA &_ref); 
} 

Tất nhiên, các nhà xây dựng được xác định theo cách này:

ClassB::ClassB(ClassA &_ref) : ref(_ref) { /* ... */ } 

Câu hỏi của tôi là: Khi một thể hiện của lớp ' ClassB 'bị phá hủy, là đối tượng được tham chiếu bởi' ClassB :: ref 'cũng bị phá hủy?

+1

Chính xác thì ý của bạn là gì "bị hủy"? Chỉ cần gọi destructor, hoặc cũng phát hành bộ nhớ?Dù sao, không phải những điều đó xảy ra :) – fredoverflow

Trả lời

13

Tham chiếu không là gì ngoài bí danh cho biến, bí danh bị hủy, chứ không phải biến thực tế. Bạn có thể xem xét nó một số loại con trỏ, nhưng có những lý do để kiềm chế loại suy nghĩ (tà ác) :).

0

Không; tài liệu tham khảo chỉ là một cú pháp thay thế cho con trỏ. Giá trị mà chúng tham chiếu sẽ không được sửa đổi nếu tham chiếu được deallocated.

+6

Tham chiếu không phải là cú pháp thay thế cho con trỏ. Chúng là bí danh cho các đối tượng khác. Bạn có thể nói "trong cùng một cách con trỏ không xóa những gì họ trỏ đến, tài liệu tham khảo để không phá hủy những gì họ bí danh." – GManNickG

+0

Con trỏ là một địa chỉ trong bộ nhớ, bị bỏ qua bởi toán tử '*' hoặc '->'. Tham chiếu là một địa chỉ trong bộ nhớ, được tham chiếu bởi toán tử '.'. Nếu bạn không hiểu cách con trỏ và tài liệu tham khảo về cơ bản giống hệt nhau, bạn không có kinh doanh làm việc trong C++. –

+1

@John: Nếu bạn muốn chỉ cho tôi vị trí trong tiêu chuẩn có nội dung "Tham chiếu là cú pháp thay thế cho con trỏ", hãy là khách của tôi. – GManNickG

2

No. Đó là lý do tại sao bạn cần một trình phá hủy ~ClassB nếu ClassB chịu trách nhiệm lưu trữ ref mà có thể không.

+0

"không có máu". – MSalters

+0

trong tất cả các thế giới tốt nhất có thể;) – msw

-1

Tôi không có thông số C++ trên tay, nhưng tôi đoán là "Không".

Con trỏ không bị xóa tự động khi đối tượng bị hủy, tôi thấy không có lý do nào tham chiếu phải khác nhau. Thêm vào đó, việc tham chiếu tự động bị hủy sẽ trở nên chín muồi đối với các lỗi thú vị.

0

Nếu bạn muốn nó bị hủy, bạn sẽ phải đóng gói nó (thường được thực hiện thông qua con trỏ "thông minh", như std :: shared_ptr hoặc std :: unique_ptr), sẽ tự động giải phóng bộ nhớ theo cách thích hợp Sự phá hủy B. Các tham chiếu trong ngôn ngữ không có hành vi giải phóng bộ nhớ liên kết với chúng, ngoại trừ bộ nhớ thực của tham chiếu, trái ngược với tham chiếu.

Bạn sẽ phải xây dựng và hiểu mô hình bộ nhớ của riêng bạn. Mọi người thường sử dụng shared_ptr và tính tham chiếu để sử dụng cơ bản.

7

No. Tham chiếu thành viên không ảnh hưởng đến tuổi thọ của bất kỳ điều gì họ trỏ đến. Điều này có nghĩa là điều họ bí danh có thể tồn tại lâu hơn hoặc ngắn hơn so với tham chiếu.

On the other hand, const references can affect the lifetime of what they point to if they point to a temporary.

Trong trường hợp của bạn thì không.

+0

+1 cho "mặt khác" của bạn. Tôi đã không nhận ra rằng tham chiếu const có thể ảnh hưởng đến một đời đối tượng. –

1

Khi một đối tượng được loại bỏ trong C++, bộ nhớ của nó bị phân phối và do đó mọi thứ được nhúng trong nó (chẳng hạn như biến thành viên) cũng bị mất.

Trong trường hợp con trỏ, con trỏ là biến thành viên chứa địa chỉ, do đó địa chỉ bị "hủy" nhưng đối tượng được tham chiếu, nếu có, thì không.

Trong trường hợp thành viên tham chiếu, địa chỉ bị hủy, nhưng mục tiêu không bị ảnh hưởng.

Một lớp có thể xác định trình phá hủy có thể xác định các hành vi đặc biệt. Một hành vi phổ biến như vậy là gọi các hoạt động dọn dẹp trên các thành viên (nếu có), và để giải quyết bộ nhớ được phân bổ động trước đó. Ở đây, tuy nhiên, bạn đã có một đối tượng, do đó bạn không nên là một trong những deallocating nó.

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