2015-05-19 25 views
30

[class.dtor]/15 lần đọc, tôi nhấn mạnh:Đối tượng tồn tại trong C++ có nghĩa là gì?

Khi một destructor được gọi cho một đối tượng, đối tượng không còn tồn tại; hành vi là không xác định nếu destructor được gọi cho một đối tượng có tuổi thọ đã kết thúc (3.8).

Tuy nhiên, theo như tôi có thể biết, đây là tham chiếu duy nhất trong tiêu chuẩn cho đối tượng "hiện có". Điều này cũng dường như tương phản với [basic.life], đó là cụ thể hơn:

Thời gian tồn tại của một đối tượng kiểu T kết thúc khi:

  • nếu T là một loại lớp học với một destructor không tầm thường (12.4), cuộc gọi destructor bắt đầu hoặc

  • bộ nhớ mà đối tượng chiếm được sử dụng lại hoặc được giải phóng.

Chúng tôi có hai các chữ khác nhau ở đây: "cuộc đời của một đối tượng đầu" và "đối tượng không còn tồn tại," cựu chỉ xảy ra với một destructor không tầm thường và sau này sẽ xảy ra với bất kỳ destructor. Ý nghĩa của sự khác biệt là gì? Hàm ý của một đối tượng không còn tồn tại?

+1

C++ 03 có cùng một từ ngữ. Làm cho tôi tự hỏi nếu nó chỉ là shoddiness mà cần một số dọn dẹp. –

+0

Tôi nghĩ rằng đây chỉ là những từ đồng nghĩa nhưng sẽ chờ xem liệu có ai biết tiêu chuẩn tốt hơn tôi làm đường ống ... –

+10

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active. html # 1285 –

Trả lời

1

Từ được trích dẫn dường như ngụ ý rằng trình biên dịch có thể chèn mã chính xác trả về bộ nhớ được kết hợp với đối tượng vào vùng heap tại số bắt đầu từ số của hàm hủy. Nhưng làm điều đó sẽ loại bỏ khả năng của một đối tượng để tham chiếu đến các thành viên của chính nó trong quá trình hủy diệt, điều được yêu cầu nếu một vật thể có khả năng tự hủy diệt.

Vì vậy, tôi nghĩ rằng từ ngữ được trích dẫn bị hỏng và phải được khắc phục.

Về những gì "đời" và "sự tồn tại" có nghĩa là, tôi đề xuất rằng có một số hoàn cảnh khác nhau, trong đó họ có nghĩa là những thứ khác nhau:

Trong bối cảnh xây dựng, đời và tồn tại bắt đầu khi một constructor bắt đầu. Bên ngoài bối cảnh đó, chúng bắt đầu khi một hàm khởi tạo kết thúc.

Trong bối cảnh hủy diệt, thời gian tồn tại và sự tồn tại kết thúc khi hủy kết thúc. Bên ngoài bối cảnh đó, chúng kết thúc khi sự phá hủy bắt đầu.

Vì vậy, một đối tượng có thể tham chiếu đến các thành viên của chính nó trong quá trình xây dựng và có khả năng chuyển chính nó đến các chức năng của các đối tượng khác, có thể đề cập đến đối tượng và các thành viên. Nhưng nói chung, các đối tượng (các thể hiện của các lớp) có thể không được tham chiếu (mà không tạo ra hành vi không xác định) cho đến sau khi một trong các hàm tạo của chúng đã kết thúc.

Và một đối tượng hủy có thể tham chiếu đến các thành viên và chức năng gọi của các đối tượng khác (hiện có), có thể ám chỉ đối tượng đang bị hủy và/hoặc các thành viên. Nhưng nói chung, một đối tượng có thể không được tham chiếu sau khi destructor của nó đã bắt đầu.Đây là loại ý nghĩa đa ngữ theo ý nghĩa nhất đối với tôi, nhưng tôi có thể thấy các đối số được thực hiện rằng một đối tượng nên được coi là còn sống từ thời điểm bộ nhớ được cấp cho nó vào thời điểm bộ nhớ đó phát hành, và tôi sẽ nói rằng bộ nhớ cho một bản sao nông nên được phân bổ cho một đối tượng khi một trong các nhà xây dựng của nó bắt đầu, và phát hành khi destructor của nó kết thúc.

+0

Phải. Đã chỉnh sửa câu trả lời. – Shavais

+0

Vâng, tôi không chắc chắn phần nào của não tôi bị bỏ qua một bên đến từ đâu. Nhưng hy vọng phần còn lại của câu trả lời là nhiều hoặc ít hợp lệ. – Shavais

+0

Đồng ý. Có một upvote. –

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