Đây là mẫu thiết kế có liên quan đến ngoại lệ ném từ bên trong một constructor đối tượng.
Trong C++ nếu một ngoại lệ được ném từ bên trong một đối tượng costructor thì đối tượng đó được coi là không được xây dựng ở tất cả, bởi thời gian chạy ngôn ngữ. Kết quả là đối tượng hủy sẽ không được gọi khi đối tượng nằm ngoài phạm vi.
Điều này có nghĩa rằng nếu bạn có mã như thế này bên trong constructor của bạn:
int *p1 = new int;
int *p2 = new int;
và mã như thế này trong destructor của bạn:
delete p1;
delete p2;
và khởi tạo của p2 bên trong constructor không do không còn bộ nhớ, nên ngoại lệ bad_alloc được ném bởi nhà điều hành mới mới. Vào thời điểm đó đối tượng của bạn không được xây dựng hoàn toàn, ngay cả khi bộ nhớ cho p1 đã được cấp phát chính xác. Nếu điều này xảy ra, destructor sẽ không được gọi và bạn đang bị rò rỉ p1.
Vì vậy, càng có nhiều mã bạn đặt bên trong hàm tạo, càng có nhiều khả năng lỗi sẽ xảy ra dẫn đến rò rỉ bộ nhớ tiềm ẩn.
Đó là lý do chính cho lựa chọn thiết kế đó, không quá điên sau khi tất cả.
Thông tin thêm về này trên Herb Sutter blog: Constructors exceptions in C++
Nguồn
2012-05-08 08:27:39
Tại sao thẻ này được gắn thẻ với cả Java và C++? Cố ý? –
không, nhưng đôi khi init được gọi để khởi tạo sau hai hàm tạo khác nhau - để tránh việc dán mã. – Anycorn
init ảo() có thể được sử dụng để khởi tạo đa hình – vid