2013-07-15 61 views
12

Nó được biết rằng nếu một nhà xây dựng ném, sau đó tất cả các đối tượng phụ được xây dựng hoàn toàn sẽ bị phá hủy theo thứ tự ngược bao gồm dữ liệu thành viên và tất cả các loại lớp cơ sở. Các destructor không nhận được gọi là cho các nhà thầu không ủy nhiệm mặc dù. Đối với một hàm tạo ủy nhiệm, đối tượng đã được xây dựng khi phần thân của hàm tạo được nhập vào, nhưng việc xây dựng tiếp tục phần nào. Vì vậy, câu hỏi đặt ra cho dù destructor của lớp được gọi là, nếu các nhà xây dựng ủy nhiệm ném một ngoại lệ từ bên trong cơ thể của nó?Trình hủy có được gọi khi một nhà xây dựng ủy nhiệm ném không?

class X 
{ 
public: 
    X(); 
    X(int) : X() { throw std::exception(); } // is ~X() implicitely called? 
    ~X(); 
}; 
+2

'X' không phải là đối tượng thành viên của' X', vậy tại sao hàm hủy của nó lại được gọi? – Praetorian

+5

@Praetorian: Bởi vì nó được xây dựng hoàn toàn bởi nhà xây dựng ủy nhiệm; và bởi vì tiêu chuẩn nói nó sẽ như thế. –

+1

Liên quan: http://stackoverflow.com/q/14386840/981959 –

Trả lời

12

Quy tắc là hàm hủy được gọi cho tất cả các đối tượng được xây dựng hoàn toàn . Đối tượng được coi là được xây dựng hoàn toàn khi bất kỳ nhà xây dựng nào đã hoàn thành, bao gồm cả nhà thầu được ủy quyền (mặc dù chương trình vẫn tiếp tục trong một hàm tạo khác ).

+0

Bạn có thể trích dẫn một tham chiếu chuẩn cho điều này (mặc dù nó có ý nghĩa trực quan) không? –

+2

@MarkB §15.2/2 "[...] Tương tự, nếu hàm tạo không ủy nhiệm cho một đối tượng đã hoàn thành thực thi và một hàm tạo ủy nhiệm cho đối tượng đó thoát với một ngoại lệ, thì hàm hủy của đối tượng sẽ được gọi. [ ...] ". –

+0

Tôi không chắc chắn tôi thích hành vi đó. –

5

Thời gian tồn tại của một đối tượng bắt đầu khi bất kỳ constructor (nghĩa là., Trong trường hợp đoàn, người bạn đời ulti- mục tiêu constructor) là thành công hoàn thành. Mục đích của [C++ 03] §3.8, “cuộc gọi cấu trúc đã hoàn thành” có nghĩa là bất kỳ cuộc gọi hàm tạo nào. Điều này có nghĩa là một ngoại lệ được ném ra khỏi cơ thể của một nhà xây dựng ủy nhiệm sẽ gây ra destructorto được gọi tự động.

source.

here là một bài viết hay về các nhà thầu ủy nhiệm, nếu ai cũng muốn đọc nó.

+1

Ngoại trừ nguồn mà bạn trích dẫn là đề xuất ban đầu cho đối tượng địa lý. Những từ chính xác mà bạn trích dẫn đã làm _not_ biến nó thành tiêu chuẩn cuối cùng, hoặc ít nhất tôi không thể tìm thấy chúng. Và "bài viết hay" bạn trích dẫn là nhiều hơn về những việc cần làm khi bạn không có các nhà thầu ủy nhiệm. –

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