Tại "lõi" đối phó với các ngoại lệ là hầu như mọi thứ nên được dọn sạch thông qua các trình phá hủy. Ví dụ, nếu bạn "mới" một đối tượng bạn nhận được một con trỏ "thô"; nếu một ngoại lệ được ném ra một nơi nào đó, bạn phải chắc chắn rằng con trỏ thô này là đúng "xóa" d - nhưng chắc chắn rằng bạn không xóa một con trỏ thô chưa được khởi tạo.
Mặt khác, nếu bạn lưu con trỏ đó vào một tiêu chuẩn :: unique_ptr bạn không phải làm gì cả; khi unique_ptr bị hủy, đối tượng sẽ bị xóa, và sự phá hủy đối tượng xảy ra tự động: khi unique_ptr đi ra khỏi phạm vi, trình biên dịch sẽ gọi dọn dẹp, hoàn toàn vô hình (vì vậy không có nhiều mã lộn xộn với tấn cuộc gọi dọn dẹp) và tự động (như vậy không còn 'ouch, khi nó có con đường hiếm hoi mà không ai thực sự thử nghiệm nó quên để dọn dẹp').
Điều tương tự cũng có thể áp dụng cho mọi tài nguyên; có "các con trỏ tự động" cho các đối tượng COM (như được sử dụng trong DirectX), hầu hết các khung công tác sẽ cung cấp cho bạn một đối tượng kiểu "scoped lock" để bao quanh các mutex (vì vậy nó khóa mutex khi đối tượng được tạo và mở khóa khi nó bị phá hủy) và bạn có thể viết các trình bao bọc nhỏ để xử lý các trình xử lý Windows khác nhau.
Về cơ bản, nếu bạn đặt tất cả việc dọn dẹp của bạn vào các trình phá hủy, bạn sẽ không bao giờ phải "thử ... bắt ... rethrow" chỉ để làm sạch. Và destructors của "lớn hơn" đối tượng thường sẽ rất đơn giản, như hầu như tất cả các "chứa" đối tượng được làm sạch tự động bởi destructors của họ.
Nguồn
2012-10-04 10:57:59
Làm thế nào về liên kết, mà Als cung cấp cho bạn ở đây http://stackoverflow.com/questions/12723492/how-to-clean-initialized-resources-if-exception-thrown-from-constructor-in-c? Thành viên này có phải là đối tượng không? – ForEveR
Bạn cần xử lý gì? Thông thường, bạn chỉ đơn giản là để cho các ngoại lệ tuyên truyền, để 5 đối tượng đầu tiên bị tiêu diệt một cách sạch sẽ. Một số ngữ cảnh khác sẽ hữu ích – jalf
RAII. (Http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization) – ScaryAardvark