Vì vậy, tôi sử dụng Qt rất nhiều với sự phát triển của mình và yêu thích nó. Mẫu thiết kế thông thường với các đối tượng Qt là phân bổ chúng bằng cách sử dụng new
.Chính sách bắt std :: bad_alloc
Khá nhiều ví dụ (đặc biệt là mã được tạo bởi nhà thiết kế Qt) hoàn toàn không kiểm tra ngoại lệ std::bad_alloc
. Kể từ khi các đối tượng được phân bổ (thường là vật dụng và như vậy) là nhỏ, điều này hầu như không bao giờ là một vấn đề. Sau khi tất cả, nếu bạn không phân bổ một cái gì đó như 20 byte, tỷ lệ cược là không có nhiều bạn có thể làm để khắc phục vấn đề.
Hiện tại, tôi đã áp dụng chính sách bao gồm phân bổ "lớn" (bất kỳ thứ gì trên một hoặc hai trang) trong thử/nắm bắt. Nếu điều đó không thành công, tôi hiển thị một thông báo cho người dùng, khá nhiều thứ nhỏ hơn, tôi sẽ chỉ cho phép ứng dụng gặp sự cố với một ngoại lệ std::bad_alloc
.
Vì vậy, tôi tự hỏi các trường học nghĩ về điều này là gì về điều này?
Có chính sách tốt để kiểm tra từng hoạt động của new
không? Hay chỉ những người tôi mong đợi có khả năng thất bại?
Ngoài ra, đây rõ ràng là một câu chuyện hoàn toàn khác khi giao dịch với môi trường nhúng nơi tài nguyên có thể bị hạn chế hơn nhiều. Tôi yêu cầu trong bối cảnh của một ứng dụng máy tính để bàn, nhưng sẽ quan tâm đến các câu trả lời liên quan đến các kịch bản khác.
thực sự không có gì mới là một lựa chọn khả thi, nhưng nếu có một vài phân bổ trong một khối mã nhất định, nó sẽ có nhiều chi tiết hơn là chỉ sử dụng khối try/catch. Tôi đồng ý 100% rằng "phải làm gì" là câu hỏi thực sự, vì trong các tình huống bộ nhớ thực sự giới hạn số tiền bạn có thể làm để sửa chữa mọi thứ. –
Không quá nhiều "phải làm gì", nhưng "bạn có thể làm bất cứ điều gì cả" – jalf
Nếu bạn bắt đủ cao, một số bộ nhớ có thể đã được giải phóng trong khi thư giãn. Bạn có thể chắc chắn rằng một cái gì đó được giải thoát, sử dụng new_handler hoặc các thủ thuật như 'int flag = false; thử {vector v (1000); flag = true; doEventLoop(); } catch (bad_alloc) {if (flag) cout << "Tôi có 4k để sử dụng để nhắc người dùng \ n"; } ' –