Tôi đang tìm hiểu về thành ngữ RAII trong C++ và cách sử dụng con trỏ thông minh.RAII hoạt động như thế nào khi một nhà xây dựng đưa ra một ngoại lệ?
Trong bài đọc của mình, tôi đã bắt gặp hai điều mà đối với tôi, dường như mâu thuẫn lẫn nhau.
Quoted from http://www.hackcraft.net/raii/:
... nếu một đối tượng thành viên với ngữ nghĩa RAII đã được tạo và một ngoại lệ xảy ra trước khi các nhà xây dựng đã hoàn thành sau đó destructor của nó sẽ được gọi như là một phần của ngăn xếp ươm. Do đó, một đối tượng điều khiển nhiều tài nguyên có thể làm sạch chúng ngay cả khi nó không được xây dựng hoàn toàn bằng cách sử dụng các đối tượng RAII thành viên.
Nhưng trích dẫn từ http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10:
Nếu một constructor ném một ngoại lệ, destructor của đối tượng không được chạy. Nếu đối tượng của bạn đã làm điều gì đó cần được hoàn tác (chẳng hạn như cấp phát một số bộ nhớ, mở một tệp hoặc khóa một semaphore), "thứ cần được hoàn tác" này phải được ghi nhớ bởi một thành viên dữ liệu bên trong đối tượng.
Sau đó, nguồn được liên kết thứ hai đề xuất sử dụng con trỏ thông minh để giải quyết vấn đề của những thứ đã được phân bổ trong hàm tạo.
Vậy điều gì thực sự xảy ra trong các trường hợp này?
+1 đây là cách mà "newprogrammer [s]" * nên * đặt câu hỏi! –