Chức năng make_shared()
của Boost hứa hẹn sẽ là ngoại lệ an toàn khi cố gắng tạo một shared_ptr
.Tại sao tăng không có make_scoped()?
Tại sao không có make_scoped()
tương đương? Có cách nào hay nhất?
Dưới đây là một ví dụ mã từ boost::scoped_ptr
documentation mà dường như không an toàn với tôi:
boost::scoped_ptr<Shoe> x(new Shoe);
dòng mã này sẽ thực hiện những ba điều để:
- Phân bổ bộ nhớ heap cho
Shoe
- Gọi hàm tạo cho
Shoe
- Gọi constructor cho
boost::scoped_ptr<Shoe>
Nếu các nhà xây dựng cho Shoe
ném một ngoại lệ, bộ nhớ
sẽ bị rò rỉ.
(xem R. Martinho Fernandes trả lời)scoped_ptr
sẽ không xử lý deallocation vì nó chưa được xây dựng.
Đây có phải là sự giám sát không? Hoặc là có một giải pháp mà tôi đã không thông báo?
Ví dụ này an toàn, nhưng không phải là: 'f (boost :: scoped_ptr (giày mới), g());'. Thực hành mã hóa để giải quyết vấn đề: Luôn đặt tên con trỏ thông minh là biến hoặc thành viên, không xây dựng chúng dưới dạng biểu thức con tạm thời. –
aschepler